Author: nextgens
Date: 2007-06-21 09:26:28 +0000 (Thu, 21 Jun 2007)
New Revision: 13677

Modified:
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/Node.java
Log:
Implement 1445: Use a mersenne twister or something for packet padding, not 
Yarrow

Both the padding length and the padding itself are generated from MT... MT is 
seeded once for all at node's startup; it should be enough for our purpose as 
the period is 2^19937 - 1 (analysis of the randomness probably costy enough).

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-06-20 
23:09:21 UTC (rev 13676)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-06-21 
09:26:28 UTC (rev 13677)
@@ -438,7 +438,7 @@
         BlockCipher cipher = pn.outgoingSetupCipher;
         if(logMINOR) Logger.minor(this, "Outgoing cipher: 
"+HexUtil.bytesToHex(pn.outgoingSetupKey));
         PCFBMode pcfb = PCFBMode.create(cipher);
-        int paddingLength = node.random.nextInt(100);
+        int paddingLength = node.fastWeakRandom.nextInt(100);
         byte[] iv = new byte[pcfb.lengthIV()];
         node.random.nextBytes(iv);
         byte[] hash = SHA256.digest(output);
@@ -454,8 +454,7 @@
         pcfb.blockEncipher(output, 0, output.length);
         System.arraycopy(output, 0, data, hash.length+iv.length+2, 
output.length);
         byte[] random = new byte[paddingLength];
-        // FIXME don't use node.random
-        node.random.nextBytes(random);
+        node.fastWeakRandom.nextBytes(random);
         System.arraycopy(random, 0, data, 
hash.length+iv.length+2+output.length, random.length);
         try {
                sendPacket(data, replyTo, pn, 0);
@@ -1254,11 +1253,11 @@
         // Ideally we'd mimic the size profile - and the session bytes! - of a 
common protocol.

         int paddedLen = ((packetLength + 63) / 64) * 64;
-        paddedLen += node.random.nextInt(64);
+        paddedLen += node.fastWeakRandom.nextInt(64);
         if(packetLength <= 1280 && paddedLen > 1280) paddedLen = 1280;

         byte[] padding = new byte[paddedLen - packetLength];
-        node.random.nextBytes(padding);
+        node.fastWeakRandom.nextBytes(padding);

         packetLength = paddedLen;


Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-06-20 23:09:21 UTC (rev 
13676)
+++ trunk/freenet/src/freenet/node/Node.java    2007-06-21 09:26:28 UTC (rev 
13677)
@@ -28,10 +28,12 @@
 import java.util.Iterator;
 import java.util.Locale;
 import java.util.MissingResourceException;
+import java.util.Random;
 import java.util.zip.DeflaterOutputStream;

 import net.i2p.util.NativeBigInteger;

+import org.spaceroots.mantissa.random.MersenneTwister;
 import org.tanukisoftware.wrapper.WrapperManager;

 import com.sleepycat.je.DatabaseException;
@@ -318,7 +320,6 @@
        private DSAPrivateKey myPrivKey;
        /** My public key */
        private DSAPublicKey myPubKey;
-       
        /** My ARK SSK private key */
        InsertableClientSSK myARK;
        /** My ARK sequence number */
@@ -370,6 +371,8 @@
        final File extraPeerDataDir;
        /** Strong RNG */
        public final RandomSource random;
+       /** Weak but fast RNG */
+       public final Random fastWeakRandom;
        final UdpSocketManager usm;
        final FNPPacketMangler packetMangler;
        final DNSRequester dnsr;
@@ -732,6 +735,8 @@
                recentlyCompletedIDs = new LRUQueue();
                this.config = config;
                this.random = random;
+               // Seeding it with anything longer than an int is useless
+               this.fastWeakRandom = new MersenneTwister(random.nextInt());
                cachedPubKeys = new LRUHashtable();
                lm = new LocationManager(random);



Reply via email to