Author: nextgens
Date: 2006-09-07 21:07:05 +0000 (Thu, 07 Sep 2006)
New Revision: 10422

Modified:
   trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
   trunk/freenet/src/freenet/crypt/DSAGroupGenerator.java
   trunk/freenet/src/freenet/crypt/DSAPublicKey.java
   trunk/freenet/src/freenet/crypt/DiffieHellmanContext.java
   trunk/freenet/src/freenet/crypt/SHA256.java
   trunk/freenet/src/freenet/crypt/StationToStationContext.java
   trunk/freenet/src/freenet/keys/CHKBlock.java
   trunk/freenet/src/freenet/keys/ClientCHKBlock.java
   trunk/freenet/src/freenet/keys/ClientKSK.java
   trunk/freenet/src/freenet/keys/ClientSSK.java
   trunk/freenet/src/freenet/keys/InsertableClientSSK.java
   trunk/freenet/src/freenet/keys/InsertableUSK.java
   trunk/freenet/src/freenet/keys/Key.java
   trunk/freenet/src/freenet/keys/NodeSSK.java
   trunk/freenet/src/freenet/keys/SSKBlock.java
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/LocationManager.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeARKInserter.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/SSKInsertSender.java
   trunk/freenet/src/freenet/support/io/BucketTools.java
Log:
Various stuffs I've done in the train:

        * Refactor PeerNode.getMessageDigest to SHA256.getMessageDigest() (may b
e debatable ; pro : generic handling of errors ; con : add a non-standard depend
ency to most of our classes)
        * Fix some bugs in StationToStationContext : I hadn't the book on my kne
es when I did it ; it needs reviewing!
        * Fix the "grab peerCryptoGroup" from ARK code and extend it to DH excha
nge
        * Add a mutex when computing the signature on Node.exportPublicFieldSet(
)
        * Remove signature from ARKs
        * Remove some dead-code/unused inserts/catch blocks
        * Make "final static" variables from Node public
        * More untested work on FNPPacketMangler

Modified: trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2006-09-07 
11:32:14 UTC (rev 10421)
+++ trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2006-09-07 
21:07:05 UTC (rev 10422)
@@ -1,5 +1,6 @@
 package freenet.clients.http;

+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
@@ -9,7 +10,6 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;

 import freenet.client.DefaultMIMETypes;
 import freenet.client.FetchException;
@@ -21,6 +21,7 @@
 import freenet.config.Config;
 import freenet.config.InvalidConfigValueException;
 import freenet.config.SubConfig;
+import freenet.crypt.SHA256;
 import freenet.keys.FreenetURI;
 import freenet.node.Node;
 import freenet.node.NodeClientCore;
@@ -337,15 +338,18 @@
        }

        private static String getForceValue(FreenetURI key, long time) {
-               try {
-                       MessageDigest md5 = 
MessageDigest.getInstance("SHA-256");
-                       md5.update(random);
-                       md5.update(key.toString(false).getBytes());
-                       md5.update(Long.toString(time / 
FORCE_GRAIN_INTERVAL).getBytes());
-                       return HexUtil.bytesToHex(md5.digest());
-               } catch (NoSuchAlgorithmException e) {
+               MessageDigest md = SHA256.getMessageDigest();
+               ByteArrayOutputStream bos = new ByteArrayOutputStream();
+               
+               try{
+                       bos.write(random);
+                       bos.write(key.toString(false).getBytes());
+                       bos.write(Long.toString(time / 
FORCE_GRAIN_INTERVAL).getBytes());
+               } catch (IOException e) {
                        throw new Error(e);
                }
+               
+               return HexUtil.bytesToHex(md.digest(bos.toByteArray()));
        }

        public static void maybeCreateFProxyEtc(NodeClientCore core, Node node, 
Config config, SubConfig fproxyConfig) throws IOException, 
InvalidConfigValueException {

Modified: trunk/freenet/src/freenet/crypt/DSAGroupGenerator.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAGroupGenerator.java      2006-09-07 
11:32:14 UTC (rev 10421)
+++ trunk/freenet/src/freenet/crypt/DSAGroupGenerator.java      2006-09-07 
21:07:05 UTC (rev 10422)
@@ -31,7 +31,7 @@
                        throw new IllegalArgumentException("hashLength must not 
be greater than keyLength");
                MessageDigest md;
                if(hashLength == 256) {
-                       md = MessageDigest.getInstance("SHA-256");
+                       md = SHA256.getMessageDigest();
                } else if(hashLength == 160) {
                        md = MessageDigest.getInstance("SHA-160");
                } else {

Modified: trunk/freenet/src/freenet/crypt/DSAPublicKey.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAPublicKey.java   2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/crypt/DSAPublicKey.java   2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -3,7 +3,6 @@

 import java.math.BigInteger;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.io.*;

 import freenet.support.Base64;
@@ -140,12 +139,8 @@
     }

     public byte[] asBytesHash() {
-       try {
-                       MessageDigest md256 = 
MessageDigest.getInstance("SHA-256");
-                       return md256.digest(asBytes());
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
+       MessageDigest md256 = SHA256.getMessageDigest();
+       return md256.digest(asBytes());
     }

     public byte[] asPaddedBytes() {

Modified: trunk/freenet/src/freenet/crypt/DiffieHellmanContext.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DiffieHellmanContext.java   2006-09-07 
11:32:14 UTC (rev 10421)
+++ trunk/freenet/src/freenet/crypt/DiffieHellmanContext.java   2006-09-07 
21:07:05 UTC (rev 10422)
@@ -1,7 +1,6 @@
 package freenet.crypt;

 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;

 import net.i2p.util.NativeBigInteger;
 import freenet.support.HexUtil;
@@ -57,11 +56,8 @@
         NativeBigInteger sharedSecret =
             (NativeBigInteger) peerExponential.modPow(myExponent, 
group.getP());
         MessageDigest md;
-        try {
-            md = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e) {
-            throw new Error(e);
-        }
+        
+        md = SHA256.getMessageDigest();
         key = md.digest(sharedSecret.toByteArray());
         if(logMINOR)
             Logger.minor(this, "Key="+HexUtil.bytesToHex(key));

Modified: trunk/freenet/src/freenet/crypt/SHA256.java
===================================================================
--- trunk/freenet/src/freenet/crypt/SHA256.java 2006-09-07 11:32:14 UTC (rev 
10421)
+++ trunk/freenet/src/freenet/crypt/SHA256.java 2006-09-07 21:07:05 UTC (rev 
10422)
@@ -39,7 +39,14 @@

 package freenet.crypt;

+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import org.tanukisoftware.wrapper.WrapperManager;
+
+import freenet.node.Node;
 import freenet.support.HexUtil;
+import freenet.support.Logger;

 /**
  * @author  Jeroen C. van Gelderen (gelderen at cryptix.org)
@@ -316,7 +323,24 @@
        return HexUtil.bytesToHex(d);
     }

-    public static void main(String[] args) {
+    /**
+        * Create a new SHA-256 MessageDigest
+        * Either succeed or stop the node.
+        */
+       public  static MessageDigest getMessageDigest() {
+           try {
+               return MessageDigest.getInstance("SHA-256");
+           } catch (NoSuchAlgorithmException e2) {
+               //TODO: maybe we should point to a HOWTO for freejvms
+                       Logger.error(Node.class, "Check your JVM settings 
especially the JCE!"+e2);
+                       System.err.println("Check your JVM settings especially 
the JCE!"+e2);
+                       e2.printStackTrace();
+                       WrapperManager.stop(Node.EXIT_CRAPPY_JVM);
+               }
+               return null;
+       }
+
+       public static void main(String[] args) {
        byte[] buffer=new byte[1024];
        SHA256 s=new SHA256();
        try {

Modified: trunk/freenet/src/freenet/crypt/StationToStationContext.java
===================================================================
--- trunk/freenet/src/freenet/crypt/StationToStationContext.java        
2006-09-07 11:32:14 UTC (rev 10421)
+++ trunk/freenet/src/freenet/crypt/StationToStationContext.java        
2006-09-07 21:07:05 UTC (rev 10422)
@@ -4,6 +4,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigInteger;
+import java.security.MessageDigest;
 import java.util.Random;

 import net.i2p.util.NativeBigInteger;
@@ -15,7 +16,7 @@
     // Set on startup

     /** Random number */
-    final int myRandom;
+    final NativeBigInteger myRandom;

     /** My exponential */
     final NativeBigInteger myExponential;
@@ -44,8 +45,9 @@
         this.group = group;
         this.hisPubKey = hisKey;
         // How big is the random ? FIXME!
-        this.myRandom = random.nextInt();
-        this.myExponential = (NativeBigInteger) group.getG().pow(myRandom);
+        this.myRandom = new NativeBigInteger(2048, rand);
+        // Not sure of what I'm doing below.
+        this.myExponential = (NativeBigInteger) group.getG().modPow(myRandom, 
group.getQ());
         lastUsedTime = System.currentTimeMillis();
         logMINOR = Logger.shouldLog(Logger.MINOR, this);
     }
@@ -74,7 +76,8 @@
         // Calculate key
         if(logMINOR)
             Logger.minor(this, "My exponent: "+myExponential.toHexString()+", 
my random: "+myRandom+", peer's exponential: "+hisExponential.toHexString());
-        key = (NativeBigInteger) hisExponential.pow(myRandom);
+        // Not sure of what I'm doing below
+        key = (NativeBigInteger) hisExponential.modPow(myRandom, group.getQ());

         if(logMINOR)
             Logger.minor(this, "Key="+HexUtil.bytesToHex(key.toByteArray()));
@@ -84,10 +87,12 @@
     public synchronized byte[] concatAndSignAndCrypt(){
        lastUsedTime = System.currentTimeMillis();
        if(hisExponential == null) throw new IllegalStateException("Can't call 
concatAndSignAndCrypt() until setOtherSideExponential() has been called!");
-       if(key == null)  throw new IllegalStateException("Can't call 
concatAndSignAndCrypt() until getKey() has been called!");
+       if(key == null)  getKey();

+       MessageDigest md = SHA256.getMessageDigest();
+       
        String message = new String("("+myExponential+","+hisExponential+")");
-       DSASignature signature = DSA.sign(group, myPrivateKey, new 
BigInteger(message.getBytes()), random);
+       DSASignature signature = DSA.sign(group, myPrivateKey, new 
BigInteger(md.digest(message.getBytes())), random);

        if(logMINOR)
             Logger.minor(this, "The concat result : "+message+". Its signature 
: "+signature);
@@ -113,19 +118,20 @@
        lastUsedTime = System.currentTimeMillis();
        if(data == null) return false;
        if(hisExponential == null) throw new IllegalStateException("Can't call 
concatAndSignAndCrypt() until setOtherSideExponential() has been called!");
-       if(key == null)  throw new IllegalStateException("Can't call 
concatAndSignAndCrypt() until getKey() has been called!");
+       if(key == null)  getKey();

        ByteArrayInputStream is = new ByteArrayInputStream(data);
        EncipherInputStream ei = new EncipherInputStream(is, getCipher());
        final String message = new 
String("("+hisExponential+","+myExponential+")");

-       try{
+       MessageDigest md = SHA256.getMessageDigest();
+        try{
                String signatureToCheck = ei.toString();
                ei.close();
                is.close();

-               if(signatureToCheck != null && signatureToCheck.equals(message))
-                       if(DSA.verify(hisPubKey, new 
DSASignature(signatureToCheck), new BigInteger(message.getBytes())))
+               if(signatureToCheck != null)
+                       if(DSA.verify(hisPubKey, new 
DSASignature(signatureToCheck), new BigInteger(md.digest(message.getBytes()))))
                                return true;

        } catch(IOException e){

Modified: trunk/freenet/src/freenet/keys/CHKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/CHKBlock.java        2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/keys/CHKBlock.java        2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -1,8 +1,9 @@
 package freenet.keys;

 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;

+import freenet.crypt.SHA256;
+
 /**
  * @author amphibian
  * 
@@ -57,12 +58,7 @@
         // Check the hash
         if(hashIdentifier != HASH_SHA256)
             throw new CHKVerifyException("Hash not SHA-256");
-        MessageDigest md;
-        try {
-            md = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e) {
-            throw new Error(e);
-        }
+        MessageDigest md = SHA256.getMessageDigest();

         md.update(headers);
         md.update(data);

Modified: trunk/freenet/src/freenet/keys/ClientCHKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientCHKBlock.java  2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/keys/ClientCHKBlock.java  2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -2,13 +2,13 @@

 import java.io.IOException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;

 import org.spaceroots.mantissa.random.MersenneTwister;

 import freenet.crypt.BlockCipher;
 import freenet.crypt.PCFBMode;
+import freenet.crypt.SHA256;
 import freenet.crypt.UnsupportedCipherException;
 import freenet.crypt.ciphers.Rijndael;
 import freenet.keys.Key.Compressed;
@@ -95,13 +95,7 @@
         pcfb.blockDecipher(hbuf, 0, hbuf.length);
         pcfb.blockDecipher(dbuf, 0, dbuf.length);
         // Check: Decryption key == hash of data (not including header)
-        MessageDigest md256;
-        try {
-            md256 = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e1) {
-            // FIXME: log this properly?
-            throw new Error(e1);
-        }
+        MessageDigest md256 = SHA256.getMessageDigest();
         byte[] dkey = md256.digest(dbuf);
         if(!java.util.Arrays.equals(dkey, key.cryptoKey)) {
             throw new CHKDecodeException("Check failed: decrypt key == 
H(data)");
@@ -149,13 +143,7 @@

         // Now do the actual encode

-        MessageDigest md256;
-        try {
-            md256 = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e1) {
-            // FIXME: log this properly?
-            throw new Error(e1);
-        }
+        MessageDigest md256 = SHA256.getMessageDigest();
         // First pad it
         if(finalData.length != 32768) {
             // Hash the data

Modified: trunk/freenet/src/freenet/keys/ClientKSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientKSK.java       2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/keys/ClientKSK.java       2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -3,13 +3,13 @@
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;

 import org.spaceroots.mantissa.random.MersenneTwister;

 import freenet.crypt.DSAPrivateKey;
 import freenet.crypt.DSAPublicKey;
 import freenet.crypt.Global;
+import freenet.crypt.SHA256;

 public class ClientKSK extends InsertableClientSSK {

@@ -31,12 +31,7 @@
        }

        public static ClientKSK create(String keyword) {
-               MessageDigest md256;
-               try {
-                       md256 = MessageDigest.getInstance("SHA-256");
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
+               MessageDigest md256 = SHA256.getMessageDigest();
                byte[] keywordHash;
                try {
                        keywordHash = md256.digest(keyword.getBytes("UTF-8"));

Modified: trunk/freenet/src/freenet/keys/ClientSSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientSSK.java       2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/keys/ClientSSK.java       2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -3,10 +3,10 @@
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;

 import freenet.crypt.DSAPublicKey;
+import freenet.crypt.SHA256;
 import freenet.crypt.UnsupportedCipherException;
 import freenet.crypt.ciphers.Rijndael;
 import freenet.support.Logger;
@@ -37,12 +37,7 @@
                        throw new MalformedURLException("Pubkey hash wrong 
length: "+pubKeyHash.length+" should be "+NodeSSK.PUBKEY_HASH_SIZE);
                if(cryptoKey.length != CRYPTO_KEY_LENGTH)
                        throw new MalformedURLException("Decryption key wrong 
length: "+cryptoKey.length+" should be "+CRYPTO_KEY_LENGTH);
-               MessageDigest md;
-               try {
-                       md = MessageDigest.getInstance("SHA-256");
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
+               MessageDigest md = SHA256.getMessageDigest();
                if(pubKey != null) {
                        byte[] pubKeyAsBytes = pubKey.asBytes();
                        md.update(pubKeyAsBytes);

Modified: trunk/freenet/src/freenet/keys/InsertableClientSSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/InsertableClientSSK.java     2006-09-07 
11:32:14 UTC (rev 10421)
+++ trunk/freenet/src/freenet/keys/InsertableClientSSK.java     2006-09-07 
21:07:05 UTC (rev 10422)
@@ -3,7 +3,6 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;

 import net.i2p.util.NativeBigInteger;

@@ -17,6 +16,7 @@
 import freenet.crypt.Global;
 import freenet.crypt.PCFBMode;
 import freenet.crypt.RandomSource;
+import freenet.crypt.SHA256;
 import freenet.crypt.UnsupportedCipherException;
 import freenet.crypt.ciphers.Rijndael;
 import freenet.keys.Key.Compressed;
@@ -44,12 +44,7 @@
                DSAGroup g = Global.DSAgroupBigA;
                DSAPrivateKey privKey = new DSAPrivateKey(new 
NativeBigInteger(1, uri.getKeyVal()));
                DSAPublicKey pubKey = new DSAPublicKey(g, privKey);
-               MessageDigest md;
-               try {
-                       md = MessageDigest.getInstance("SHA-256");
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
+               MessageDigest md = SHA256.getMessageDigest();
                md.update(pubKey.asBytes());
                return new InsertableClientSSK(uri.getDocName(), md.digest(), 
pubKey, privKey, uri.getCryptoKey());
        }
@@ -65,13 +60,7 @@
                        throw new SSKEncodeException(e.getMessage(), e);
                }
                // Pad it
-        MessageDigest md256;
-        try {
-            md256 = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e1) {
-            // FIXME: log this properly?
-            throw new Error(e1);
-        }
+        MessageDigest md256 = SHA256.getMessageDigest();
         byte[] data;
         // First pad it
         if(compressedData.length != SSKBlock.DATA_LENGTH) {
@@ -191,13 +180,8 @@
                DSAGroup g = Global.DSAgroupBigA;
                DSAPrivateKey privKey = new DSAPrivateKey(g, r);
                DSAPublicKey pubKey = new DSAPublicKey(g, privKey);
-               MessageDigest md;
+               MessageDigest md = SHA256.getMessageDigest();
                try {
-                       md = MessageDigest.getInstance("SHA-256");
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
-               try {
                        return new InsertableClientSSK(docName, 
md.digest(pubKey.asBytes()), pubKey, privKey, ckey);
                } catch (MalformedURLException e) {
                        throw new Error(e);

Modified: trunk/freenet/src/freenet/keys/InsertableUSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/InsertableUSK.java   2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/keys/InsertableUSK.java   2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -2,7 +2,6 @@

 import java.net.MalformedURLException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;

 import net.i2p.util.NativeBigInteger;

@@ -10,6 +9,7 @@
 import freenet.crypt.DSAPrivateKey;
 import freenet.crypt.DSAPublicKey;
 import freenet.crypt.Global;
+import freenet.crypt.SHA256;
 import freenet.support.Logger;

 /**
@@ -36,12 +36,7 @@
                DSAGroup g = Global.DSAgroupBigA;
                DSAPrivateKey privKey = new DSAPrivateKey(new 
NativeBigInteger(1, uri.getKeyVal()));
                DSAPublicKey pubKey = new DSAPublicKey(g, privKey);
-               MessageDigest md;
-               try {
-                       md = MessageDigest.getInstance("SHA-256");
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
+               MessageDigest md = SHA256.getMessageDigest();
                md.update(pubKey.asBytes());
                return new InsertableUSK(uri.getDocName(), md.digest(), 
uri.getCryptoKey(), privKey, g, uri.getSuggestedEdition());
        }

Modified: trunk/freenet/src/freenet/keys/Key.java
===================================================================
--- trunk/freenet/src/freenet/keys/Key.java     2006-09-07 11:32:14 UTC (rev 
10421)
+++ trunk/freenet/src/freenet/keys/Key.java     2006-09-07 21:07:05 UTC (rev 
10422)
@@ -4,8 +4,8 @@
 import java.io.DataOutput;
 import java.io.IOException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;

+import freenet.crypt.SHA256;
 import freenet.io.WritableToDataOutputStream;
 import freenet.support.Fields;
 import freenet.support.Logger;
@@ -69,12 +69,7 @@
      */
     public synchronized double toNormalizedDouble() {
         if(cachedNormalizedDouble > 0) return cachedNormalizedDouble;
-        MessageDigest md;
-        try {
-            md = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e) {
-            throw new Error(e);
-        }
+        MessageDigest md = SHA256.getMessageDigest();
         md.update(routingKey);
         int TYPE = getType();
         md.update((byte)(TYPE >> 8));

Modified: trunk/freenet/src/freenet/keys/NodeSSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/NodeSSK.java 2006-09-07 11:32:14 UTC (rev 
10421)
+++ trunk/freenet/src/freenet/keys/NodeSSK.java 2006-09-07 21:07:05 UTC (rev 
10422)
@@ -5,10 +5,10 @@
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;

 import freenet.crypt.DSAPublicKey;
+import freenet.crypt.SHA256;
 import freenet.support.Fields;
 import freenet.support.HexUtil;
 import freenet.support.Logger;
@@ -47,12 +47,7 @@
                this.pubKeyHash = pkHash;
                this.pubKey = pubKey;
                if(pubKey != null) {
-                       MessageDigest md256;
-                       try {
-                               md256 = MessageDigest.getInstance("SHA-256");
-                       } catch (NoSuchAlgorithmException e) {
-                               throw new Error(e);
-                       }
+                       MessageDigest md256 = SHA256.getMessageDigest();
                        byte[] hash = md256.digest(pubKey.asBytes());
                        if(!Arrays.equals(hash, pkHash))
                                throw new SSKVerifyException("Invalid pubKey: 
wrong hash");
@@ -66,12 +61,7 @@

        // routingKey = H( E(H(docname)) + H(pubkey) )
        private static byte[] makeRoutingKey(byte[] pkHash, byte[] ehDocname) {
-               MessageDigest md256;
-               try {
-                       md256 = MessageDigest.getInstance("SHA-256");
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
+               MessageDigest md256 = SHA256.getMessageDigest();
                md256.update(ehDocname);
                md256.update(pkHash);
                return md256.digest();
@@ -132,12 +122,7 @@
                if(pubKey2 == null) return;
                if((pubKey == null) || !pubKey2.equals(pubKey)) {
                        if(pubKey2 != null) {
-                               MessageDigest md256;
-                               try {
-                                       md256 = 
MessageDigest.getInstance("SHA-256");
-                               } catch (NoSuchAlgorithmException e) {
-                                       throw new Error(e);
-                               }
+                               MessageDigest md256 = SHA256.getMessageDigest();
                                byte[] newPubKeyHash = 
md256.digest(pubKey2.asBytes());
                                if(Arrays.equals(pubKeyHash, newPubKeyHash)) {
                                        if(pubKey != null) {

Modified: trunk/freenet/src/freenet/keys/SSKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/SSKBlock.java        2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/keys/SSKBlock.java        2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -1,13 +1,13 @@
 package freenet.keys;

 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;

 import net.i2p.util.NativeBigInteger;
 import freenet.crypt.DSA;
 import freenet.crypt.DSAPublicKey;
 import freenet.crypt.DSASignature;
+import freenet.crypt.SHA256;
 import freenet.support.HexUtil;

 /**
@@ -94,12 +94,7 @@
                this.pubKey = nodeKey.getPubKey();
                if(pubKey == null)
                        throw new SSKVerifyException("PubKey was null from 
"+nodeKey);
-        MessageDigest md;
-        try {
-            md = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e) {
-            throw new Error(e);
-        }
+        MessageDigest md = SHA256.getMessageDigest();
         // Now verify it
         hashIdentifier = (short)(((headers[0] & 0xff) << 8) + (headers[1] & 
0xff));
         if(hashIdentifier != HASH_SHA256)

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2006-09-07 
11:32:14 UTC (rev 10421)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2006-09-07 
21:07:05 UTC (rev 10422)
@@ -1,7 +1,6 @@
 package freenet.node;

 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;

 import net.i2p.util.NativeBigInteger;
@@ -11,6 +10,7 @@
 import freenet.crypt.DiffieHellmanContext;
 import freenet.crypt.EntropySource;
 import freenet.crypt.PCFBMode;
+import freenet.crypt.SHA256;
 import freenet.crypt.StationToStationContext;
 import freenet.io.comm.*;
 import freenet.io.comm.Peer.LocalAddressException;
@@ -150,7 +150,7 @@
         // Does the packet match IV E( H(data) data ) ?
         PCFBMode pcfb = new PCFBMode(authKey);
         int ivLength = pcfb.lengthIV();
-        MessageDigest md = getDigest();
+        MessageDigest md = SHA256.getMessageDigest();
         int digestLength = md.getDigestLength();
         if(length < digestLength + ivLength + 4) {
             if(logMINOR) Logger.minor(this, "Too short: "+length+" should be 
at least "+(digestLength + ivLength + 4));
@@ -281,7 +281,7 @@
         }else if (negType == 1){
                // We are gonna do simple StS

-               if((packetType < 0) || (packetType > 2)) {
+               if((packetType < 0) || (packetType > 3)) {
                        Logger.error(this, "Decrypted auth packet but unknown 
packet type "+packetType+" from "+replyTo+" possibly from "+pn);
                        return;
                }
@@ -307,23 +307,45 @@
                 * 
                 *      Alice and Bob are now mutually authenticated and have a 
shared secret.
                 *  This secret, K, can then be used to encrypt further 
communication.
+                *  
+                *  I suggest we add one more phase to simplify the code : 2d 
is splited up
+                *  into two packets so that both alice and bob send the same 
kind of packets. 
                 */

-               if(packetType == 0) {
-                       StationToStationContext ctx = new 
StationToStationContext(node.getMyPrivKey(), pn.peerCryptoGroup, pn.peerPubKey, 
node.random);
+               // be carefull with StationToStationContext constructors ; it 
will be expensive in terms of cpu and can be DoSed, on the other hand, when 
shall we reset the context ? maybe creating a new packetType ... with a time 
based restriction 
+               if(packetType == 0) { // 0 won't be received, but we need to 
initialize the exchange
+                       StationToStationContext ctx = 
pn.getKeyAgreementSchemeContext()== null ? new 
StationToStationContext(node.getMyPrivKey(), pn.peerCryptoGroup, pn.peerPubKey, 
node.random) : (StationToStationContext)pn.getKeyAgreementSchemeContext();
                        if(ctx == null) return;
-                       // Send g^x%p
+                       pn.setKeyAgreementSchemeContext(ctx);
+                       // We send g^x
                        sendFirstStSPacket(1, ctx.getOurExponential(), pn, 
replyTo);
+               } else if(packetType == 2) {
+                       StationToStationContext ctx = 
pn.getKeyAgreementSchemeContext()== null ? new 
StationToStationContext(node.getMyPrivKey(), pn.peerCryptoGroup, pn.peerPubKey, 
node.random) : (StationToStationContext)pn.getKeyAgreementSchemeContext();
+                       if(ctx == null) return;
+                       pn.setKeyAgreementSchemeContext(ctx);
+                       // We got g^y
+                       ctx.setOtherSideExponential(new 
NativeBigInteger(payload));
+                       // We send E(S(H( our exponential, his exponential)))
+                       sendSecondStSPacket(3, ctx, pn, replyTo, payload);
                } else if(packetType == 1) {
-                       StationToStationContext ctx = new 
StationToStationContext(node.getMyPrivKey(), pn.peerCryptoGroup, pn.peerPubKey, 
node.random);
+                       StationToStationContext ctx = (StationToStationContext) 
pn.getKeyAgreementSchemeContext();
                        if(ctx == null) return;
-                       sendSecondStSPacket(2, ctx, pn, replyTo, payload);
-               } else if(packetType == 2) {
-
+                       // We got g^x
+                       ctx.setOtherSideExponential(new 
NativeBigInteger(payload));
+                       // We send g^y
+                       sendFirstStSPacket(2, ctx.getOurExponential(), pn, 
replyTo);
+                       // We send E(S(H( our exponential, his exponential)))
+                       sendSecondStSPacket(3, ctx, pn, replyTo, payload);
+               } else if(packetType == 3) {
+                       StationToStationContext ctx = (StationToStationContext) 
pn.getKeyAgreementSchemeContext();
+                       if(ctx == null) return;
+                       if(!ctx.isAuthentificationSuccessfull(payload)) return;
+                       // we are done if the above test is sucessfull!
                }
-
-               // Not implemented yet... fail
-               return;
+               
+               /*
+                * We need some kind of locking above... and maybe some DoS 
protection
+                */
         }
     }

@@ -352,7 +374,7 @@
         System.arraycopy(Fields.longToBytes(node.bootID), 0, data, 0, 8);
         System.arraycopy(myRef, 0, data, 8, myRef.length);

-        MessageDigest md = getDigest();
+        MessageDigest md = SHA256.getMessageDigest();

         byte[] hash = md.digest(data);

@@ -433,7 +455,7 @@
         PCFBMode pcfb = new PCFBMode(cipher);
         byte[] iv = new byte[pcfb.lengthIV()];
         node.random.nextBytes(iv);
-        MessageDigest md = getDigest();
+        MessageDigest md = SHA256.getMessageDigest();
         byte[] hash = md.digest(output);
         if(logMINOR) Logger.minor(this, "Data hash: 
"+HexUtil.bytesToHex(hash));
         byte[] data = new byte[iv.length + hash.length + 2 /* length */ + 
output.length];
@@ -496,7 +518,7 @@
         System.arraycopy(payload, 3+ivLength+HASH_LENGTH, data, 0, dataLength);
         pcfb.blockDecipher(data, 0, dataLength);
         // Check the hash
-        MessageDigest md = getDigest();
+        MessageDigest md = SHA256.getMessageDigest();
         byte[] realHash = md.digest(data);
         if(Arrays.equals(realHash, hash)) {
             // Success!
@@ -571,17 +593,6 @@
     }

     /**
-     * Create a new SHA-256 MessageDigest
-     */
-    private MessageDigest getDigest() {
-        try {
-            return MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e) {
-            throw new Error(e);
-        }
-    }
-
-    /**
      * Try to process an incoming packet with a given PeerNode.
      * We need to know where the packet has come from in order to
      * decrypt and authenticate it.
@@ -659,7 +670,7 @@

         //Logger.minor(this, "Plaintext:\n"+HexUtil.bytesToHex(plaintext));

-        MessageDigest md = getDigest();
+        MessageDigest md = SHA256.getMessageDigest();
         md.update(seqBuf);
         md.update(plaintext);
         byte[] realHash = md.digest();
@@ -1383,12 +1394,7 @@
             throw new IllegalStateException("Block size must be half key size: 
blockSize="+
                     sessionCipher.getBlockSize()+", 
keySize="+sessionCipher.getKeySize());

-        MessageDigest md;
-        try {
-            md = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e) {
-            throw new Error(e);
-        }
+        MessageDigest md = SHA256.getMessageDigest();

         int digestLength = md.getDigestLength();


Modified: trunk/freenet/src/freenet/node/LocationManager.java
===================================================================
--- trunk/freenet/src/freenet/node/LocationManager.java 2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/node/LocationManager.java 2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -1,7 +1,6 @@
 package freenet.node;

 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
@@ -9,6 +8,7 @@
 import java.util.Date;

 import freenet.crypt.RandomSource;
+import freenet.crypt.SHA256;
 import freenet.io.comm.DMT;
 import freenet.io.comm.DisconnectedException;
 import freenet.io.comm.Message;
@@ -199,12 +199,7 @@

             byte[] hisHash = 
((ShortBuffer)origMessage.getObject(DMT.HASH)).getData();

-            MessageDigest md;
-            try {
-                md = MessageDigest.getInstance("SHA-256");
-            } catch (NoSuchAlgorithmException e) {
-                throw new Error(e);
-            }
+            MessageDigest md = SHA256.getMessageDigest();

             if(hisHash.length != md.getDigestLength()) {
                 Logger.error(this, "Invalid SwapRequest from peer: wrong 
length hash "+hisHash.length+" on "+uid);
@@ -347,12 +342,7 @@
                     myValueLong[i+2] = Double.doubleToLongBits(friendLocs[i]);
                 byte[] myValue = Fields.longsToBytes(myValueLong);

-                MessageDigest md;
-                try {
-                    md = MessageDigest.getInstance("SHA-256");
-                } catch (NoSuchAlgorithmException e) {
-                    throw new Error(e);
-                }
+                MessageDigest md = SHA256.getMessageDigest();

                 byte[] myHash = md.digest(myValue);


Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-09-07 11:32:14 UTC (rev 
10421)
+++ trunk/freenet/src/freenet/node/Node.java    2006-09-07 21:07:05 UTC (rev 
10422)
@@ -22,7 +22,6 @@
 import java.net.MalformedURLException;
 import java.net.UnknownHostException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -47,6 +46,7 @@
 import freenet.crypt.DSASignature;
 import freenet.crypt.Global;
 import freenet.crypt.RandomSource;
+import freenet.crypt.SHA256;
 import freenet.io.comm.DMT;
 import freenet.io.comm.DisconnectedException;
 import freenet.io.comm.FreenetInetAddress;
@@ -338,6 +338,8 @@
        byte[] identityHashHash;        
        /** The signature of the above fieldset */
        private DSASignature myReferenceSignature = null;
+       /** A synchronization object used while signing the reference fiedlset 
*/
+       private volatile Object referenceSync = new Object();
        /** An ordered version of the FieldSet, without the signature */
        private String mySignedReference = null;
        private String myName;
@@ -363,31 +365,31 @@
        final TokenBucket requestOutputThrottle;
        final TokenBucket requestInputThrottle;
        private boolean inputLimitDefault;
-       static short MAX_HTL = 10;
-       static final int EXIT_STORE_FILE_NOT_FOUND = 1;
-       static final int EXIT_STORE_IOEXCEPTION = 2;
-       static final int EXIT_STORE_OTHER = 3;
-       static final int EXIT_USM_DIED = 4;
+       public static short MAX_HTL = 10;
+       public static final int EXIT_STORE_FILE_NOT_FOUND = 1;
+       public static final int EXIT_STORE_IOEXCEPTION = 2;
+       public static final int EXIT_STORE_OTHER = 3;
+       public static final int EXIT_USM_DIED = 4;
        public static final int EXIT_YARROW_INIT_FAILED = 5;
-       static final int EXIT_TEMP_INIT_ERROR = 6;
-       static final int EXIT_TESTNET_FAILED = 7;
+       public static final int EXIT_TEMP_INIT_ERROR = 6;
+       public static final int EXIT_TESTNET_FAILED = 7;
        public static final int EXIT_MAIN_LOOP_LOST = 8;
        public static final int EXIT_COULD_NOT_BIND_USM = 9;
-       static final int EXIT_IMPOSSIBLE_USM_PORT = 10;
-       static final int EXIT_NO_AVAILABLE_UDP_PORTS = 11;
+       public static final int EXIT_IMPOSSIBLE_USM_PORT = 10;
+       public static final int EXIT_NO_AVAILABLE_UDP_PORTS = 11;
        public static final int EXIT_TESTNET_DISABLED_NOT_SUPPORTED = 12;
-       static final int EXIT_INVALID_STORE_SIZE = 13;
-       static final int EXIT_BAD_DOWNLOADS_DIR = 14;
-       static final int EXIT_BAD_NODE_DIR = 15;
-       static final int EXIT_BAD_TEMP_DIR = 16;
-       static final int EXIT_COULD_NOT_START_FCP = 17;
-       static final int EXIT_COULD_NOT_START_FPROXY = 18;
-       static final int EXIT_COULD_NOT_START_TMCI = 19;
-       static final int EXIT_CRAPPY_JVM = 255;
+       public static final int EXIT_INVALID_STORE_SIZE = 13;
+       public static final int EXIT_BAD_DOWNLOADS_DIR = 14;
+       public static final int EXIT_BAD_NODE_DIR = 15;
+       public static final int EXIT_BAD_TEMP_DIR = 16;
+       public static final int EXIT_COULD_NOT_START_FCP = 17;
+       public static final int EXIT_COULD_NOT_START_FPROXY = 18;
+       public static final int EXIT_COULD_NOT_START_TMCI = 19;
+       public static final int EXIT_CRAPPY_JVM = 255;
        public static final int EXIT_DATABASE_REQUIRES_RESTART = 20;
        public static final int EXIT_COULD_NOT_START_UPDATER = 21;
-       static final int EXIT_EXTRA_PEER_DATA_DIR = 22;
-       static final int EXIT_THROTTLE_FILE_ERROR = 23;
+       public static final int EXIT_EXTRA_PEER_DATA_DIR = 22;
+       public static final int EXIT_THROTTLE_FILE_ERROR = 23;
        public static final int PEER_NODE_STATUS_CONNECTED = 1;
        public static final int PEER_NODE_STATUS_ROUTING_BACKED_OFF = 2;
        public static final int PEER_NODE_STATUS_TOO_NEW = 3;
@@ -513,12 +515,7 @@
                } catch (IllegalBase64Exception e2) {
                        throw new IOException();
                }
-               MessageDigest md;
-               try {
-                       md = MessageDigest.getInstance("SHA-256");
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
+               MessageDigest md = SHA256.getMessageDigest();
                identityHash = md.digest(myIdentity);
                identityHashHash = md.digest(identityHash);
                String loc = fs.get("location");
@@ -633,12 +630,7 @@
                // FIXME use a real IP!
                myIdentity = new byte[32];
                r.nextBytes(myIdentity);
-               MessageDigest md;
-               try {
-                       md = MessageDigest.getInstance("SHA-256");
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error(e);
-               }
+               MessageDigest md = SHA256.getMessageDigest();
                identityHash = md.digest(myIdentity);
                identityHashHash = md.digest(identityHash);
                myName = newName();
@@ -1658,26 +1650,23 @@
                fs.put("ark.number", Long.toString(this.myARKNumber));
                fs.put("ark.pubURI", this.myARK.getURI().toString(false));

-               // TODO: maybe synchronize ?
-               if(myReferenceSignature == null || mySignedReference == null || 
!mySignedReference.equals(fs.toOrderedString())){
-                       mySignedReference = fs.toOrderedString();
-                       try{
-                       MessageDigest md = MessageDigest.getInstance("SHA-256");
-                               myReferenceSignature = DSA.sign(myCryptoGroup, 
myPrivKey, new BigInteger(md.digest(mySignedReference.getBytes("UTF-8"))), 
random);
-                       } catch(UnsupportedEncodingException e){
-                               //duh ?
-                               Logger.error(this, "Error while signing the 
node identity!"+e);
-                               System.err.println("Error while signing the 
node identity!"+e);
-                               e.printStackTrace();
-                               exit(EXIT_CRAPPY_JVM);
-                       } catch (NoSuchAlgorithmException e2) {
-                               Logger.error(this, "Error while signing the 
node identity!"+e2);
-                               System.err.println("Error while signing the 
node identity!"+e2);
-                               e2.printStackTrace();
-                               exit(EXIT_CRAPPY_JVM);
-               }
+               synchronized (referenceSync) {
+                       if(myReferenceSignature == null || mySignedReference == 
null || !mySignedReference.equals(fs.toOrderedString())){
+                               mySignedReference = fs.toOrderedString();       
+
+                               try{
+                                       MessageDigest md = 
SHA256.getMessageDigest();
+                                       myReferenceSignature = 
DSA.sign(myCryptoGroup, myPrivKey, new 
BigInteger(md.digest(mySignedReference.getBytes("UTF-8"))), random);
+                               } catch(UnsupportedEncodingException e){
+                                       //duh ?
+                                       Logger.error(this, "Error while signing 
the node identity!"+e);
+                                       System.err.println("Error while signing 
the node identity!"+e);
+                                       e.printStackTrace();
+                                       exit(EXIT_CRAPPY_JVM);
+                               }
+                       }
+                       fs.put("sig", myReferenceSignature.toString());
                }
-               fs.put("sig", myReferenceSignature.toString());

                if(logMINOR) Logger.minor(this, "My reference: "+fs);
                return fs;
@@ -2300,13 +2289,7 @@
                synchronized(cachedPubKeys) {
                        DSAPublicKey key2 = (DSAPublicKey) cachedPubKeys.get(w);
                        if((key2 != null) && !key2.equals(key)) {
-                               MessageDigest md256;
-                               // Check the hash.
-                               try {
-                                       md256 = 
MessageDigest.getInstance("SHA-256");
-                               } catch (NoSuchAlgorithmException e) {
-                                       throw new Error(e);
-                               }
+                               MessageDigest md256 = SHA256.getMessageDigest();
                                byte[] hashCheck = md256.digest(key.asBytes());
                                if(Arrays.equals(hashCheck, hash)) {
                                        Logger.error(this, "Hash is 
correct!!!");

Modified: trunk/freenet/src/freenet/node/NodeARKInserter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeARKInserter.java 2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/node/NodeARKInserter.java 2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -112,6 +112,7 @@
                // Delete entire ark.* field for now. Changing this and 
automatically moving to the new may be supported in future.
                fs.removeSubset("ark");
                fs.removeValue("location");
+               fs.removeValue("sig");
                //fs.remove("version"); - keep version because of its 
significance in reconnection

                String s = fs.toString();

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -16,7 +16,6 @@
 import java.net.MalformedURLException;
 import java.net.UnknownHostException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -34,6 +33,7 @@
 import freenet.crypt.DSAPublicKey;
 import freenet.crypt.DSASignature;
 import freenet.crypt.KeyAgreementSchemeContext;
+import freenet.crypt.SHA256;
 import freenet.crypt.UnsupportedCipherException;
 import freenet.crypt.ciphers.Rijndael;
 import freenet.io.comm.DMT;
@@ -336,12 +336,7 @@
             throw new FSParseException(e);
                }

-        MessageDigest md;
-        try {
-            md = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e2) {
-            throw new Error(e2);
-        }
+        MessageDigest md = SHA256.getMessageDigest();

         if(identity == null) throw new FSParseException("No identity");
         identityHash = md.digest(identity);
@@ -618,35 +613,12 @@
                        FreenetURI uri = new FreenetURI(arkPubKey);
                        ClientSSK ssk = new ClientSSK(uri);
                        ark = new USK(ssk, arkNo);
-                       
-                       // Maybe synchronize ?
-                       if(peerCryptoGroup == null){
-                               SimpleFieldSet sfs = fs.subset("dsaGroup");
-                               Logger.normal(this, "Picking up peerCrypto 
group from ark for "+this.privateDarknetComment);
-                               if(sfs == null)
-                                       this.peerCryptoGroup = null;
-                               else
-                                       this.peerCryptoGroup = 
DSAGroup.create(sfs);
-                       }
-                       
-                       if(peerPubKey == null){
-                               SimpleFieldSet sfs = fs.subset("dsaGroup");
-                               Logger.normal(this, "Picking up dsaGroup from 
ark for "+this.privateDarknetComment);
-                               
-                               sfs = fs.subset("dsaPubKey");
-                               if(sfs == null)
-                                       this.peerPubKey = null;
-                               else
-                                       this.peerPubKey = 
DSAPublicKey.create(sfs, peerCryptoGroup);
-                       }
-               }
+               }
         } catch (MalformedURLException e) {
                Logger.error(this, "Couldn't parse ARK info for "+this+": "+e, 
e);
         } catch (NumberFormatException e) {
                Logger.error(this, "Couldn't parse ARK info for "+this+": "+e, 
e);
-        } catch (IllegalBase64Exception e) {
-               Logger.error(this, "Couldn't parse ARK info for "+this+": "+e, 
e);
-               }
+        }

                synchronized(this) {
                        if(ark != null) {
@@ -1480,7 +1452,7 @@
                return true;
     }

-    private final Object arkFetcherSync = new Object();
+    private volatile Object arkFetcherSync = new Object();

     void startARKFetcher() {
        // FIXME any way to reduce locking here?
@@ -1664,6 +1636,27 @@
             byte[] newIdentity = Base64.decode(identityString);
             if(!Arrays.equals(newIdentity, identity))
                 throw new FSParseException("Identity changed!!");
+            
+            // FIXME: throw an exception if not present once everyone has 
updated but do NOT replace things
+            if(peerCryptoGroup == null){
+               SimpleFieldSet sfs = fs.subset("dsaGroup");
+               Logger.normal(this, "Picking up peerCrypto group from "+ 
(forARK ? "ark" : "DH") +" for "+Base64.encode(this.identity));
+               if(sfs == null)
+                       this.peerCryptoGroup = null;
+               else
+                       this.peerCryptoGroup = DSAGroup.create(fs);
+            }
+
+            if(peerPubKey == null){
+               SimpleFieldSet sfs = fs.subset("dsaGroup");
+               Logger.normal(this, "Picking up dsaGroup from "+ (forARK ? 
"ark" : "DH") +" for "+Base64.encode(this.identity));
+
+               sfs = fs.subset("dsaPubKey");
+               if(sfs == null)
+                       this.peerPubKey = null;
+               else
+                       this.peerPubKey = DSAPublicKey.create(fs, 
peerCryptoGroup);
+            }
         } catch (NumberFormatException e) {
             throw new FSParseException(e);
         } catch (IllegalBase64Exception e) {
@@ -1730,7 +1723,7 @@

         // DO NOT change detectedPeer !!!
         // The given physical.udp may be WRONG!!!
-        
+                
         String name = fs.get("myName");
         if(name == null) throw new FSParseException("No name");
         // In future, ARKs may support automatic transition when the ARK key 
is changed.

Modified: trunk/freenet/src/freenet/node/SSKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/SSKInsertSender.java 2006-09-07 11:32:14 UTC 
(rev 10421)
+++ trunk/freenet/src/freenet/node/SSKInsertSender.java 2006-09-07 21:07:05 UTC 
(rev 10422)
@@ -1,11 +1,11 @@
 package freenet.node;

 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
 import java.util.HashSet;

 import freenet.crypt.DSAPublicKey;
+import freenet.crypt.SHA256;
 import freenet.io.comm.DMT;
 import freenet.io.comm.DisconnectedException;
 import freenet.io.comm.Message;
@@ -87,12 +87,8 @@
                throw new IllegalArgumentException("Must have pubkey to insert 
data!!");
        // pubKey.fingerprint() is not the same as hash(pubKey.asBytes())). 
FIXME it should be!
        byte[] pubKeyAsBytes = pubKey.asBytes();
-       try {
-                       MessageDigest md256 = 
MessageDigest.getInstance("SHA-256");
-                       pubKeyHash = md256.digest(pubKeyAsBytes);
-               } catch (NoSuchAlgorithmException e) {
-                       throw new Error("SHA-256 not supported by system!: "+e);
-               }
+       MessageDigest md256 = SHA256.getMessageDigest();
+       pubKeyHash = md256.digest(pubKeyAsBytes);
        this.block = block;
        startTime = System.currentTimeMillis();
     }

Modified: trunk/freenet/src/freenet/support/io/BucketTools.java
===================================================================
--- trunk/freenet/src/freenet/support/io/BucketTools.java       2006-09-07 
11:32:14 UTC (rev 10421)
+++ trunk/freenet/src/freenet/support/io/BucketTools.java       2006-09-07 
21:07:05 UTC (rev 10422)
@@ -11,11 +11,10 @@
 import java.nio.channels.ReadableByteChannel;
 import java.nio.channels.WritableByteChannel;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.List;

-import freenet.support.Logger;
+import freenet.crypt.SHA256;

 /**
  * Helper functions for working with Buckets.
@@ -349,7 +348,7 @@
        public static byte[] hash(Bucket data) throws IOException {
                InputStream is = null;
                try {
-                       MessageDigest md = MessageDigest.getInstance("SHA-256");
+                       MessageDigest md = SHA256.getMessageDigest();
                        is = data.getInputStream();
                        long bucketLength = data.size();
                        long bytesRead = 0;
@@ -365,9 +364,6 @@
                        if((bytesRead != bucketLength) && (bucketLength > 0))
                                throw new IOException("Read "+bytesRead+" but 
bucket length "+bucketLength+"!");
                        return md.digest();
-               } catch (NoSuchAlgorithmException e) {
-                       Logger.error(BucketTools.class, "No such digest: 
SHA-256 !!");
-                       throw new Error("No such digest: SHA-256 !!");
                } finally {
                        if(is != null) is.close();
                }


Reply via email to