Author: nextgens
Date: 2007-10-22 11:22:47 +0000 (Mon, 22 Oct 2007)
New Revision: 15471

Modified:
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
Log:
JFK:
        Re-queue DH exponents so that we don't end up serving always the same 
even if we are under attack.

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-10-22 
10:48:27 UTC (rev 15470)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-10-22 
11:22:47 UTC (rev 15471)
@@ -2460,60 +2460,64 @@
        }

        private DiffieHellmanLightContext _genLightDiffieHellmanContext() {
-               DiffieHellmanLightContext ctx = 
DiffieHellman.generateLightContext();
+               final DiffieHellmanLightContext ctx = 
DiffieHellman.generateLightContext();
                
ctx.setSignature(crypto.sign(SHA256.digest(assembleDHParams(ctx.myExponential, 
crypto.getCryptoGroup()))));

                return ctx;
        }

+       private final void _fillJFKDHFIFO() {
+               // Use the ticket to do it off-thread
+               node.getTicker().queueTimedJob(new Runnable() {
+                       public void run() {
+                               synchronized (dhContextFIFO) {
+                                       
dhContextFIFO.addLast(_genLightDiffieHellmanContext());
+                               }
+                       }
+               }, 0);
+       }
+       
        /**
         * Change the DH Exponents on a regular basis but at most once every 
30sec
         * 
         * @return {@link DiffieHellmanLightContext}
+        * 
+        * FIXME: is it acceptable that some elements will stay around for a 
*long* time ?
+        * They will eventually be replaced but noone know when.
         */
        private DiffieHellmanLightContext getLightDiffieHellmanContext() {
                final long now = System.currentTimeMillis();

-               boolean changeDHExponents = false;
-               boolean generateOnThread = false;
-               int dhContextBufferSize = 0;
+               int dhContextFIFOSize = 0;
+               boolean requeueElement = true;

+               DiffieHellmanLightContext result = null;
+               
                synchronized (dhContextFIFO) {
-                       dhContextBufferSize = dhContextFIFO.size();
+                       dhContextFIFOSize = dhContextFIFO.size();

-                       if(dhContextBufferSize < 1) {
+                       if(dhContextFIFOSize < 1) {
                                // We need one exponent, generate it at all 
cost! (startup)
-                               changeDHExponents = true;
-                               generateOnThread = true;
-                       } else if((dhContextBufferSize < 
DH_CONTEXT_BUFFER_SIZE) && (jfkDHLastGenerationTimestamp + 30000 /*30sec*/) < 
now) {
-                               changeDHExponents = true;
-                               jfkDHLastGenerationTimestamp = now;
-                       }
-               }
-               
-               if(changeDHExponents) {
-                       if(generateOnThread) {
                                Logger.minor(this, "No DH exponent have been 
created; generate the context on-thread!");
-                               // No need to synchronize here as we are 
on-thread
-                               
dhContextFIFO.add(_genLightDiffieHellmanContext());
+                               for(int i=dhContextFIFOSize; 
i<DH_CONTEXT_BUFFER_SIZE-1; i++)
+                                       _fillJFKDHFIFO();
+                               
+                               result = _genLightDiffieHellmanContext();
                        } else {
-                               // Use the ticket to do it off-thread
-                               node.getTicker().queueTimedJob(new Runnable() {
-                                       public void run() {
-                                               synchronized (dhContextFIFO) {
-                                                       
dhContextFIFO.addLast(_genLightDiffieHellmanContext());
-                                               }
-                                       }
-                               }, 0);
-                               Logger.minor(this, "The DH exponents will been 
renewed soonish");
+                               result = (DiffieHellmanLightContext) 
dhContextFIFO.removeFirst();
+                               
+                               // Shall we replace one element of the queue ?
+                               if((jfkDHLastGenerationTimestamp + 30000 
/*30sec*/) < now) {
+                                       jfkDHLastGenerationTimestamp = now;
+                                       requeueElement = false;
+                                       _fillJFKDHFIFO();
+                               }
                        }
+                       
+                       if(requeueElement)
+                               dhContextFIFO.addLast(result);
                }
-
-               DiffieHellmanLightContext result;
-               synchronized (dhContextFIFO) {
-                       // Don't remove the exponent from the list if it's the 
only remaining one.
-                       result = (DiffieHellmanLightContext) 
(dhContextBufferSize < 2 ? dhContextFIFO.getFirst() : 
dhContextFIFO.removeFirst());
-               }
+               
                return result;
        }



Reply via email to