Author: toad
Date: 2007-06-28 20:57:14 +0000 (Thu, 28 Jun 2007)
New Revision: 13816

Added:
   trunk/freenet/src/freenet/node/NodeCrypto.java
   trunk/freenet/src/freenet/node/NodeInitException.java
Modified:
   trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
   trunk/freenet/src/freenet/crypt/SHA256.java
   trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
   trunk/freenet/src/freenet/node/CHKInsertSender.java
   trunk/freenet/src/freenet/node/ConfigurablePersister.java
   trunk/freenet/src/freenet/node/DNSRequester.java
   trunk/freenet/src/freenet/node/DarknetPeerNode.java
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/IPDetectorPluginManager.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/NodeClientCore.java
   trunk/freenet/src/freenet/node/NodeDispatcher.java
   trunk/freenet/src/freenet/node/NodeIPDetector.java
   trunk/freenet/src/freenet/node/NodeStarter.java
   trunk/freenet/src/freenet/node/NodeStats.java
   trunk/freenet/src/freenet/node/PacketSender.java
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/SSKInsertSender.java
   trunk/freenet/src/freenet/node/TestnetHandler.java
   trunk/freenet/src/freenet/node/TextModeClientInterface.java
   trunk/freenet/src/freenet/node/fcp/AddPeer.java
   trunk/freenet/src/freenet/node/simulator/RealNodePingTest.java
   trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
   trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
   trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java
   trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
Log:
Lots more refactoring: Move all node crypto and communication etc stuff to 
NodeCrypto class.

Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java       
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java       
2007-06-28 20:57:14 UTC (rev 13816)
@@ -6,6 +6,7 @@
 import java.net.URI;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.Arrays;
 import java.util.HashMap;

 import freenet.client.HighLevelSimpleClient;
@@ -122,7 +123,7 @@
                        }
                        DarknetPeerNode pn;
                        try {
-                               pn = new DarknetPeerNode(fs, node, node.peers, 
false, node.darknetPacketMangler);
+                               pn = node.createNewDarknetNode(fs);
                                pn.setPrivateDarknetCommentNote(privateComment);
                        } catch (FSParseException e1) {
                                this.sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"),
@@ -142,7 +143,7 @@
                                this.sendErrorPage(ctx, 
l10n("failedToAddNodeInternalErrorTitle"), 
l10n("failedToAddNodeInternalError"), t);
                                return;
                        }
-                       if(pn.getIdentityHash()==node.getIdentityHash()) {
+                       if(Arrays.equals(pn.getIdentity(), 
node.getDarknetIdentity())) {
                                this.sendErrorPage(ctx, 200, 
l10n("failedToAddNodeTitle"), l10n("triedToAddSelf"));
                                return;
                        }

Modified: trunk/freenet/src/freenet/crypt/SHA256.java
===================================================================
--- trunk/freenet/src/freenet/crypt/SHA256.java 2007-06-28 19:15:14 UTC (rev 
13815)
+++ trunk/freenet/src/freenet/crypt/SHA256.java 2007-06-28 20:57:14 UTC (rev 
13816)
@@ -48,6 +48,7 @@
 import org.tanukisoftware.wrapper.WrapperManager;

 import freenet.node.Node;
+import freenet.node.NodeInitException;
 import freenet.support.HexUtil;
 import freenet.support.Logger;

@@ -372,7 +373,7 @@
                System.err.println("Check your JVM settings especially the 
JCE!"+e2);
                e2.printStackTrace();
                }
-               WrapperManager.stop(Node.EXIT_CRAPPY_JVM);
+               WrapperManager.stop(NodeInitException.EXIT_CRAPPY_JVM);
                throw new RuntimeException();
        }


Modified: trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java     2007-06-28 
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java     2007-06-28 
20:57:14 UTC (rev 13816)
@@ -14,6 +14,7 @@
 import freenet.io.comm.Peer.LocalAddressException;
 import freenet.node.LoggingConfigHandler;
 import freenet.node.Node;
+import freenet.node.NodeInitException;
 import freenet.support.FileLoggerHook;
 import freenet.support.Logger;
 import freenet.support.OOMHandler;
@@ -319,7 +320,7 @@
                                } else {
                                        Logger.error(this, "MAIN LOOP 
TERMINATED");
                                        System.err.println("MAIN LOOP 
TERMINATED!");
-                                       node.exit(Node.EXIT_MAIN_LOOP_LOST);
+                                       
node.exit(NodeInitException.EXIT_MAIN_LOOP_LOST);
                                }
                        }
                }

Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -137,7 +137,7 @@
     }

        void start() {
-        Thread t = new Thread(this, "CHKInsertSender for UID "+uid+" on 
"+node.darknetPortNumber+" at "+System.currentTimeMillis());
+        Thread t = new Thread(this, "CHKInsertSender for UID "+uid+" on 
"+node.getDarknetPortNumber()+" at "+System.currentTimeMillis());
         t.setDaemon(true);
         t.start();
        }

Modified: trunk/freenet/src/freenet/node/ConfigurablePersister.java
===================================================================
--- trunk/freenet/src/freenet/node/ConfigurablePersister.java   2007-06-28 
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/ConfigurablePersister.java   2007-06-28 
20:57:14 UTC (rev 13816)
@@ -6,7 +6,6 @@
 import freenet.config.InvalidConfigValueException;
 import freenet.config.SubConfig;
 import freenet.l10n.L10n;
-import freenet.node.Node.NodeInitException;
 import freenet.support.api.StringCallback;

 public class ConfigurablePersister extends Persister {
@@ -30,7 +29,7 @@
                try {
                        setThrottles(throttleFile);
                } catch (InvalidConfigValueException e2) {
-                       throw new 
NodeInitException(Node.EXIT_THROTTLE_FILE_ERROR, e2.getMessage());
+                       throw new 
NodeInitException(NodeInitException.EXIT_THROTTLE_FILE_ERROR, e2.getMessage());
                }
        }


Modified: trunk/freenet/src/freenet/node/DNSRequester.java
===================================================================
--- trunk/freenet/src/freenet/node/DNSRequester.java    2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/DNSRequester.java    2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -19,7 +19,7 @@

     DNSRequester(Node node) {
         this.node = node;
-        myThread = new Thread(this, "DNSRequester thread for 
"+node.darknetPortNumber);
+        myThread = new Thread(this, "DNSRequester thread for 
"+node.getDarknetPortNumber());
         myThread.setDaemon(true);
     }


Modified: trunk/freenet/src/freenet/node/DarknetPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/DarknetPeerNode.java 2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/DarknetPeerNode.java 2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -94,8 +94,8 @@
      * @param fs The SimpleFieldSet to parse
      * @param node2 The running Node we are part of.
      */
-    public DarknetPeerNode(SimpleFieldSet fs, Node node2, PeerManager peers, 
boolean fromLocal, OutgoingPacketMangler mangler) throws FSParseException, 
PeerParseException, ReferenceSignatureVerificationException {
-       super(fs, node2, peers, fromLocal, mangler);
+    public DarknetPeerNode(SimpleFieldSet fs, Node node2, NodeCrypto crypto, 
PeerManager peers, boolean fromLocal, OutgoingPacketMangler mangler) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+       super(fs, node2, crypto, peers, fromLocal, mangler);

        logMINOR = Logger.shouldLog(Logger.MINOR, this);


Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-06-28 
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-06-28 
20:57:14 UTC (rev 13816)
@@ -37,6 +37,7 @@

        private static boolean logMINOR;
     final Node node;
+    final NodeCrypto crypto;
     final MessageCore usm;
     final PacketSocketHandler sock;
     final EntropySource fnpTimingSource;
@@ -67,8 +68,9 @@
        final int fullHeadersLengthMinimum;
        final int fullHeadersLengthOneMessage;

-    public FNPPacketMangler(Node node, PacketSocketHandler sock) {
+    public FNPPacketMangler(Node node, NodeCrypto crypt, PacketSocketHandler 
sock) {
         this.node = node;
+        this.crypto = crypt;
         this.usm = node.usm;
         this.sock = sock;
         fnpTimingSource = new EntropySource();
@@ -345,7 +347,7 @@
         md.update(data);
         byte[] hash = md.digest();

-        DSASignature sig = node.sign(hash);
+        DSASignature sig = crypto.sign(hash);

         byte[] r = sig.getRBytes(Node.SIGNATURE_PARAMETER_LENGTH);
         byte[] s = sig.getSBytes(Node.SIGNATURE_PARAMETER_LENGTH);

Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
===================================================================
--- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2007-06-28 
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2007-06-28 
20:57:14 UTC (rev 13816)
@@ -45,7 +45,7 @@
                        div.addChild("#", text);
                        if(suggestPortForward) {
                                L10n.addL10nSubstitution(div, 
"IPDetectorPluginManager.suggestForwardPortWithLink", new String[] { "link", 
"/link", "port" },
-                                               new String[] { "<a 
href=\"/?_CHECKED_HTTP_=http://wiki.freenetproject.org/FirewallAndRouterIssues\";>",
 "</a>", Integer.toString(node.darknetPortNumber) });
+                                               new String[] { "<a 
href=\"/?_CHECKED_HTTP_=http://wiki.freenetproject.org/FirewallAndRouterIssues\";>",
 "</a>", Integer.toString(node.getDarknetPortNumber()) });
                        }
                        return div;
                }
@@ -58,7 +58,7 @@
                        if(!suggestPortForward) return text;
                        StringBuffer sb = new StringBuffer();
                        sb.append(text);
-                       sb.append(l10n("suggestForwardPort", "port", 
Integer.toString(node.darknetPortNumber)));
+                       sb.append(l10n("suggestForwardPort", "port", 
Integer.toString(node.getDarknetPortNumber())));
                        return sb.toString();
                }


Modified: trunk/freenet/src/freenet/node/LocationManager.java
===================================================================
--- trunk/freenet/src/freenet/node/LocationManager.java 2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/LocationManager.java 2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -197,7 +197,7 @@
      */
     private void startSwapRequest() {
         Thread t = new Thread(new OutgoingSwapRequestHandler(),
-                "Outgoing swap request handler for port 
"+node.darknetPortNumber);
+                "Outgoing swap request handler for port 
"+node.getDarknetPortNumber());
         t.setDaemon(true);
         t.start();
     }
@@ -569,7 +569,7 @@
                if(logMINOR) Logger.minor(this, "Already locked");
                return false;
         }
-        if(logMINOR) Logger.minor(this, "Locking on port 
"+node.darknetPortNumber);
+        if(logMINOR) Logger.minor(this, "Locking on port 
"+node.getDarknetPortNumber());
         locked = true;
         lockedTime = System.currentTimeMillis();
         return true;
@@ -581,7 +581,7 @@
         locked = false;
         long lockTime = System.currentTimeMillis() - lockedTime;
         if(logMINOR) {
-               Logger.minor(this, "Unlocking on port "+node.darknetPortNumber);
+               Logger.minor(this, "Unlocking on port 
"+node.getDarknetPortNumber());
                Logger.minor(this, "lockTime: "+lockTime);
         }
     }
@@ -762,7 +762,7 @@
                 IncomingSwapRequestHandler isrh =
                     new IncomingSwapRequestHandler(m, pn, item);
                 if(logMINOR) Logger.minor(this, "Handling... "+uid);
-                Thread t = new Thread(isrh, "Incoming swap request handler for 
port "+node.darknetPortNumber);
+                Thread t = new Thread(isrh, "Incoming swap request handler for 
port "+node.getDarknetPortNumber());
                 t.setDaemon(true);
                 t.start();
                 return true;

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-06-28 19:15:14 UTC (rev 
13815)
+++ trunk/freenet/src/freenet/node/Node.java    2007-06-28 20:57:14 UTC (rev 
13816)
@@ -16,10 +16,7 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
 import java.net.InetAddress;
-import java.net.MalformedURLException;
 import java.net.UnknownHostException;
 import java.security.MessageDigest;
 import java.util.Arrays;
@@ -31,8 +28,6 @@
 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;

@@ -50,12 +45,8 @@
 import freenet.config.LongOption;
 import freenet.config.PersistentConfig;
 import freenet.config.SubConfig;
-import freenet.crypt.DSA;
-import freenet.crypt.DSAGroup;
-import freenet.crypt.DSAPrivateKey;
 import freenet.crypt.DSAPublicKey;
 import freenet.crypt.DSASignature;
-import freenet.crypt.Global;
 import freenet.crypt.RandomSource;
 import freenet.crypt.SHA256;
 import freenet.io.comm.DMT;
@@ -67,7 +58,6 @@
 import freenet.io.comm.Peer;
 import freenet.io.comm.PeerParseException;
 import freenet.io.comm.ReferenceSignatureVerificationException;
-import freenet.io.comm.UdpSocketHandler;
 import freenet.io.xfer.PartiallyReceivedBlock;
 import freenet.keys.CHKBlock;
 import freenet.keys.CHKVerifyException;
@@ -77,8 +67,6 @@
 import freenet.keys.ClientKeyBlock;
 import freenet.keys.ClientSSK;
 import freenet.keys.ClientSSKBlock;
-import freenet.keys.FreenetURI;
-import freenet.keys.InsertableClientSSK;
 import freenet.keys.Key;
 import freenet.keys.KeyBlock;
 import freenet.keys.KeyVerifyException;
@@ -97,14 +85,12 @@
 import freenet.store.BerkeleyDBFreenetStore;
 import freenet.store.FreenetStore;
 import freenet.store.KeyCollisionException;
-import freenet.support.Base64;
 import freenet.support.DoubleTokenBucket;
 import freenet.support.Fields;
 import freenet.support.FileLoggerHook;
 import freenet.support.HTMLEncoder;
 import freenet.support.HTMLNode;
 import freenet.support.HexUtil;
-import freenet.support.IllegalBase64Exception;
 import freenet.support.ImmutableByteArrayWrapper;
 import freenet.support.LRUHashtable;
 import freenet.support.LRUQueue;
@@ -124,28 +110,6 @@

        private static boolean logMINOR;

-       static class NodeBindtoCallback implements StringCallback {
-               
-               final Node node;
-               
-               NodeBindtoCallback(Node n) {
-                       this.node = n;
-               }
-               
-               public String get() {
-                       if(node.getBindTo()!=null)
-                               return node.getBindTo();
-                       else
-                               return "0.0.0.0";
-               }
-               
-               public void set(String val) throws InvalidConfigValueException {
-                       if(val.equals(get())) return;
-                       // FIXME why not? Can't we use 
freenet.io.NetworkInterface like everywhere else, just adapt it for UDP?
-                       throw new InvalidConfigValueException("Cannot be 
updated on the fly");
-               }
-       }
-       
        private static MeaningfulNodeNameUserAlert nodeNameUserAlert;
        private static BuildOldAgeUserAlert buildOldAgeUserAlert;
        private static TimeSkewDetectedUserAlert timeSkewDetectedUserAlert;
@@ -330,11 +294,6 @@
        private final HashSet runningCHKPutUIDs;
        private final HashSet runningSSKPutUIDs;

-       byte[] myIdentity; // FIXME: simple identity block; should be unique
-       /** Hash of identity. Used as setup key. */
-       byte[] identityHash;
-       /** Hash of hash of identity i.e. hash of setup key. */
-       byte[] identityHashHash;
        /** Semi-unique ID for swap requests. Used to identify us so that the
         * topology can be reconstructed. */
        public long swapIdentifier;
@@ -361,22 +320,12 @@

        // Darknet stuff

-       /** The object which handles our specific UDP port, pulls messages from 
it, feeds them to the packet mangler for decryption etc */
-       final UdpSocketHandler darknetSocket;
-       public final FNPPacketMangler darknetPacketMangler;
-       // FIXME: abstract out address stuff? Possibly to something like 
NodeReference?
-       final int darknetPortNumber;
-       /** My crypto group */
-       private DSAGroup darknetCryptoGroup;
-       /** My private key */
-       private DSAPrivateKey darknetPrivKey;
-       /** My public key */
-       private DSAPublicKey darknetPubKey;
-       /** My ARK SSK private key */
-       InsertableClientSSK darknetARK;
-       /** My ARK sequence number */
-       long darknetARKNumber;
+       private NodeCrypto darknetCrypto;

+       // Opennet stuff
+       
+       private NodeCrypto opennetCrypto;
+       
        // General stuff

        public final PacketSender ps;
@@ -394,35 +343,6 @@
        public static final short DEFAULT_MAX_HTL = (short)10;
        public static final int DEFAULT_SWAP_INTERVAL = 2000;
        private short maxHTL;
-       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_STORE_RECONSTRUCT = 27;
-       public static final int EXIT_USM_DIED = 4;
-       public static final int EXIT_YARROW_INIT_FAILED = 5;
-       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;
-       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;
-       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;
-       public static final int EXIT_EXTRA_PEER_DATA_DIR = 22;
-       public static final int EXIT_THROTTLE_FILE_ERROR = 23;
-       public static final int EXIT_RESTART_FAILED = 24;
-       public static final int EXIT_TEST_ERROR = 25;
-       public static final int EXIT_BAD_BWLIMIT = 26;
-       
        /** Type identifier for fproxy node to node messages, as sent on 
DMT.nodeToNodeMessage's */
        public static final int N2N_MESSAGE_TYPE_FPROXY = 1;
        /** Identifier within fproxy messages for simple, short text messages 
to be displayed on the homepage as useralerts */
@@ -442,7 +362,6 @@
        public final long startupTime;

        public final NodeClientCore clientCore;
-       final String bindto;

        // The version we were before we restarted.
        public int lastVersion;
@@ -494,24 +413,17 @@
                                        e1.initCause(e);
                                        throw e1;
                                }
-                               if(p.getPort() == darknetPortNumber) {
+                               if(p.getPort() == getDarknetPortNumber()) {
                                        // DNSRequester doesn't deal with our 
own node
                                        
ipDetector.setOldIPAddress(p.getFreenetAddress());
                                        break;
                                }
                        }
                }
-               String identity = fs.get("identity");
-               if(identity == null)
-                       throw new IOException();
-               try {
-                       myIdentity = Base64.decode(identity);
-               } catch (IllegalBase64Exception e2) {
-                       throw new IOException();
-               }
-               identityHash = SHA256.digest(myIdentity);
-               identityHashHash = SHA256.digest(identityHash);
-               swapIdentifier = Fields.bytesToLong(identityHashHash);
+               
+               darknetCrypto.readCrypto(fs);
+               
+               swapIdentifier = 
Fields.bytesToLong(darknetCrypto.identityHashHash);
                String loc = fs.get("location");
                Location l;
                try {
@@ -534,58 +446,7 @@
                } else {
                        lastVersion = 
Version.getArbitraryBuildNumber(verString);
                }
-
-               // FIXME: Back compatibility; REMOVE !!
-               try {
-                       this.darknetCryptoGroup = 
DSAGroup.create(fs.subset("dsaGroup"));
-                       this.darknetPrivKey = 
DSAPrivateKey.create(fs.subset("dsaPrivKey"), darknetCryptoGroup);
-                       this.darknetPubKey = 
DSAPublicKey.create(fs.subset("dsaPubKey"), darknetCryptoGroup);
-               } catch (NullPointerException e) {
-                       if(logMINOR) Logger.minor(this, "Caught "+e, e);
-                       this.darknetCryptoGroup = Global.DSAgroupBigA;
-                       this.darknetPrivKey = new 
DSAPrivateKey(darknetCryptoGroup, r);
-                       this.darknetPubKey = new 
DSAPublicKey(darknetCryptoGroup, darknetPrivKey);
-               } catch (IllegalBase64Exception e) {
-                       if(logMINOR) Logger.minor(this, "Caught "+e, e);
-                       this.darknetCryptoGroup = Global.DSAgroupBigA;
-                       this.darknetPrivKey = new 
DSAPrivateKey(darknetCryptoGroup, r);
-                       this.darknetPubKey = new 
DSAPublicKey(darknetCryptoGroup, darknetPrivKey);
-               }
-               InsertableClientSSK ark = null;

-               // ARK
-               
-               String s = fs.get("ark.number");
-               
-               String privARK = fs.get("ark.privURI");
-               try {
-                       if(privARK != null) {
-                               FreenetURI uri = new FreenetURI(privARK);
-                               ark = InsertableClientSSK.create(uri);
-                               if(ark.isInsecure() || s == null) {
-                                       if(ark.isInsecure())
-                                               System.out.println("Creating 
new ARK, old is insecure");
-                                       ark = null;
-                                       darknetARKNumber = 0;
-                               } else {
-                                       try {
-                                               darknetARKNumber = 
Long.parseLong(s);
-                                       } catch (NumberFormatException e) {
-                                               darknetARKNumber = 0;
-                                               ark = null;
-                                       }
-                               }
-                       }
-               } catch (MalformedURLException e) {
-                       Logger.minor(this, "Caught "+e, e);
-                       ark = null;
-               }
-               if(ark == null) {
-                       ark = InsertableClientSSK.createRandom(r, "ark");
-                       darknetARKNumber = 0;
-               }
-               this.darknetARK = ark;
-               
                wasTestnet = Fields.stringToBool(fs.get("testnet"), false);
        }

@@ -594,7 +455,7 @@
        }

        public void writeNodeFile() {
-               writeNodeFile(new File(nodeDir, "node-"+darknetPortNumber), new 
File(nodeDir, "node-"+darknetPortNumber+".bak"));
+               writeNodeFile(new File(nodeDir, 
"node-"+getDarknetPortNumber()), new File(nodeDir, 
"node-"+getDarknetPortNumber()+".bak"));
        }

        private void writeNodeFile(File orig, File backup) {
@@ -628,21 +489,11 @@

        private void initNodeFileSettings(RandomSource r) {
                Logger.normal(this, "Creating new node file from scratch");
-               // Don't need to set darknetPortNumber
+               // Don't need to set getDarknetPortNumber()
                // FIXME use a real IP!
-               myIdentity = new byte[32];
-               r.nextBytes(myIdentity);
-               MessageDigest md = SHA256.getMessageDigest();
-               identityHash = md.digest(myIdentity);
-               identityHashHash = md.digest(identityHash);
-               swapIdentifier = Fields.bytesToLong(identityHashHash);
+               darknetCrypto.initCrypto();
+               swapIdentifier = 
Fields.bytesToLong(darknetCrypto.identityHashHash);
                myName = newName();
-               this.darknetCryptoGroup = Global.DSAgroupBigA;
-               this.darknetPrivKey = new DSAPrivateKey(darknetCryptoGroup, r);
-               this.darknetPubKey = new DSAPublicKey(darknetCryptoGroup, 
darknetPrivKey);
-               darknetARK = InsertableClientSSK.createRandom(r, "ark");
-               darknetARKNumber = 0;
-               SHA256.returnMessageDigest(md);
        }

        /**
@@ -654,17 +505,6 @@
                NodeStarter.main(args);
        }

-       public static class NodeInitException extends Exception {
-               // One of the exit codes from above
-               public final int exitCode;
-               private static final long serialVersionUID = -1;
-               
-               NodeInitException(int exitCode, String msg) {
-                       super(msg+" ("+exitCode+ ')');
-                       this.exitCode = exitCode;
-               }
-       }
-       
        public boolean isUsingWrapper(){
                if(nodeStarter!=null && 
WrapperManager.isControlledByNativeWrapper())
                        return true;
@@ -765,92 +605,17 @@
                decrementAtMin = random.nextDouble() <= DECREMENT_AT_MIN_PROB;

                // FIXME maybe these configs should actually be under a node.ip 
subconfig?
-               ipDetector = new NodeIPDetector(this);
+               ipDetector = new NodeIPDetector(this, darknetCrypto);
                sortOrder = ipDetector.registerConfigs(nodeConfig, sortOrder);

                // Determine where to bind to

-               nodeConfig.register("bindTo", "0.0.0.0", sortOrder++, true, 
true, "Node.bindTo", "Node.bindToLong", new NodeBindtoCallback(this));
+               usm = new MessageCore();

-               this.bindto = nodeConfig.getString("bindTo");
-               
                // Determine the port number

-               nodeConfig.register("listenPort", -1 /* means random */, 
sortOrder++, true, true, "Node.port", "Node.portLong", new IntCallback() {
-                                       public int get() {
-                                               return darknetPortNumber;
-                                       }
-                                       public void set(int val) throws 
InvalidConfigValueException {
-                                               // FIXME implement on the fly 
listenPort changing
-                                               // Note that this sort of thing 
should be the exception rather than the rule!!!!
-                                               String msg = "Switching 
listenPort on the fly not yet supported!";
-                                               Logger.error(this, msg);
-                                               throw new 
InvalidConfigValueException(msg);
-                                       }
-               });
+               darknetCrypto = new NodeCrypto(nodeConfig, sortOrder++, this);

-               int port=-1;
-               try{
-                       port=nodeConfig.getInt("listenPort");
-               }catch (Exception e){
-                       Logger.error(this, "Caught "+e, e);
-                       System.err.println(e);
-                       e.printStackTrace();
-                       port=-1;
-               }
-               
-               usm = new MessageCore();
-               
-               UdpSocketHandler u = null;
-               
-               if(port > 65535) {
-                       throw new NodeInitException(EXIT_IMPOSSIBLE_USM_PORT, 
"Impossible port number: "+port);
-               } else if(port == -1) {
-                       // Pick a random port
-                       for(int i=0;i<200000;i++) {
-                               int portNo = 1024 + random.nextInt(65535-1024);
-                               try {
-                                       u = new UdpSocketHandler(portNo, 
InetAddress.getByName(bindto), this);
-                                       port = u.getPortNumber();
-                                       break;
-                               } catch (Exception e) {
-                                       Logger.normal(this, "Could not use 
port: "+bindto+ ':' +portNo+": "+e, e);
-                                       System.err.println("Could not use port: 
"+bindto+ ':' +portNo+": "+e);
-                                       e.printStackTrace();
-                                       continue;
-                               }
-                       }
-                       if(u == null)
-                               throw new 
NodeInitException(EXIT_NO_AVAILABLE_UDP_PORTS, "Could not find an available UDP 
port number for FNP (none specified)");
-               } else {
-                       try {
-                               u = new UdpSocketHandler(port, 
InetAddress.getByName(bindto), this);
-                       } catch (Exception e) {
-                               throw new 
NodeInitException(EXIT_IMPOSSIBLE_USM_PORT, "Could not bind to port: "+port+" 
(node already running?)");
-                       }
-               }
-               darknetSocket = u;
-               
-               Logger.normal(this, "FNP port created on "+bindto+ ':' +port);
-               System.out.println("FNP port created on "+bindto+ ':' +port);
-               darknetPortNumber = port;
-
-               nodeConfig.register("testingDropPacketsEvery", 0, sortOrder++, 
true, false, "Node.dropPacketEvery", "Node.dropPacketEveryLong",
-                               new IntCallback() {
-
-                                       public int get() {
-                                               return 
((UdpSocketHandler)darknetSocket).getDropProbability();
-                                       }
-
-                                       public void set(int val) throws 
InvalidConfigValueException {
-                                               
((UdpSocketHandler)darknetSocket).setDropProbability(val);
-                                       }
-                       
-               });
-               
-               int dropProb = nodeConfig.getInt("testingDropPacketsEvery");
-               ((UdpSocketHandler)darknetSocket).setDropProbability(dropProb);
-               
                Logger.normal(Node.class, "Creating node...");

                // Bandwidth limit
@@ -872,7 +637,7 @@

                int obwLimit = nodeConfig.getInt("outputBandwidthLimit");
                if(obwLimit <= 0)
-                       throw new NodeInitException(EXIT_BAD_BWLIMIT, "Invalid 
outputBandwidthLimit");
+                       throw new 
NodeInitException(NodeInitException.EXIT_BAD_BWLIMIT, "Invalid 
outputBandwidthLimit");
                outputBandwidthLimit = obwLimit;
                outputThrottle = new DoubleTokenBucket(obwLimit/2, 
(1000L*1000L*1000L) /  obwLimit, obwLimit, (obwLimit * 2) / 5);

@@ -898,7 +663,7 @@

                int ibwLimit = nodeConfig.getInt("inputBandwidthLimit");
                if(obwLimit <= 0)
-                       throw new NodeInitException(EXIT_BAD_BWLIMIT, "Invalid 
inputBandwidthLimit");
+                       throw new 
NodeInitException(NodeInitException.EXIT_BAD_BWLIMIT, "Invalid 
inputBandwidthLimit");
                inputBandwidthLimit = ibwLimit;
                if(ibwLimit == -1) {
                        inputLimitDefault = true;
@@ -977,16 +742,16 @@
                nodeDir = new File(nodeConfig.getString("nodeDir"));
                if(!((nodeDir.exists() && nodeDir.isDirectory()) || 
(nodeDir.mkdir()))) {
                        String msg = "Could not find or create datastore 
directory";
-                       throw new NodeInitException(EXIT_BAD_NODE_DIR, msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_BAD_NODE_DIR, msg);
                }

                // After we have set up testnet and IP address, load the node 
file
                try {
                        // FIXME should take file directly?
-                       readNodeFile(new File(nodeDir, 
"node-"+darknetPortNumber).getPath(), random);
+                       readNodeFile(new File(nodeDir, 
"node-"+getDarknetPortNumber()).getPath(), random);
                } catch (IOException e) {
                        try {
-                               readNodeFile(new 
File("node-"+darknetPortNumber+".bak").getPath(), random);
+                               readNodeFile(new 
File("node-"+getDarknetPortNumber()+".bak").getPath(), random);
                        } catch (IOException e1) {
                                initNodeFileSettings(random);
                        }
@@ -994,21 +759,19 @@

                if(wasTestnet != testnetEnabled) {
                        Logger.error(this, "Switched from testnet mode to 
non-testnet mode or vice versa! Regenerating pubkey, privkey, and deleting 
logs.");
-                       this.darknetCryptoGroup = Global.DSAgroupBigA;
-                       this.darknetPrivKey = new 
DSAPrivateKey(darknetCryptoGroup, random);
-                       this.darknetPubKey = new 
DSAPublicKey(darknetCryptoGroup, darknetPrivKey);
+                       // FIXME do we delete logs?
+                       darknetCrypto.initCrypto();
                }

                usm.setDispatcher(dispatcher=new NodeDispatcher(this));
-               darknetSocket.setLowLevelFilter(darknetPacketMangler = new 
FNPPacketMangler(this, darknetSocket));

                // Then read the peers
-               peers = new PeerManager(this, new File(nodeDir, 
"peers-"+darknetPortNumber).getPath(), darknetPacketMangler);
+               peers = new PeerManager(this, darknetCrypto, new File(nodeDir, 
"peers-"+getDarknetPortNumber()).getPath(), darknetCrypto.packetMangler);
                peers.writePeers();
                peers.updatePMUserAlert();

                // Extra Peer Data Directory
-               nodeConfig.register("extraPeerDataDir", new File(nodeDir, 
"extra-peer-data-"+darknetPortNumber).toString(), sortOrder++, true, false, 
"Node.extraPeerDir", "Node.extraPeerDirLong",
+               nodeConfig.register("extraPeerDataDir", new File(nodeDir, 
"extra-peer-data-"+getDarknetPortNumber()).toString(), sortOrder++, true, 
false, "Node.extraPeerDir", "Node.extraPeerDirLong",
                                new StringCallback() {
                                        public String get() {
                                                return 
extraPeerDataDir.getPath();
@@ -1022,7 +785,7 @@
                extraPeerDataDir = new 
File(nodeConfig.getString("extraPeerDataDir"));
                if(!((extraPeerDataDir.exists() && 
extraPeerDataDir.isDirectory()) || (extraPeerDataDir.mkdir()))) {
                        String msg = "Could not find or create extra peer data 
directory";
-                       throw new NodeInitException(EXIT_EXTRA_PEER_DATA_DIR, 
msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_EXTRA_PEER_DATA_DIR, msg);
                }

                // Name          
@@ -1091,7 +854,7 @@
                maxTotalDatastoreSize = nodeConfig.getLong("storeSize");

                if(maxTotalDatastoreSize < 0 || maxTotalDatastoreSize < (32 * 
1024 * 1024)) { // totally arbitrary minimum!
-                       throw new NodeInitException(EXIT_INVALID_STORE_SIZE, 
"Invalid store size");
+                       throw new 
NodeInitException(NodeInitException.EXIT_INVALID_STORE_SIZE, "Invalid store 
size");
                }

                maxTotalKeys = maxTotalDatastoreSize / sizePerKey;
@@ -1111,7 +874,7 @@
                storeDir = new File(nodeConfig.getString("storeDir"));
                if(!((storeDir.exists() && storeDir.isDirectory()) || 
(storeDir.mkdir()))) {
                        String msg = "Could not find or create datastore 
directory";
-                       throw new NodeInitException(EXIT_STORE_OTHER, msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_STORE_OTHER, msg);
                }

                maxStoreKeys = maxTotalKeys / 2;
@@ -1133,7 +896,7 @@
                envConfig.setLockTimeout(600*1000*1000); // should be long 
enough even for severely overloaded nodes!
                // Note that the above is in *MICRO*seconds.

-               File dbDir = new File(storeDir, "database-"+darknetPortNumber);
+               File dbDir = new File(storeDir, 
"database-"+getDarknetPortNumber());
                dbDir.mkdirs();

                File reconstructFile = new File(dbDir, "reconstruct");
@@ -1143,7 +906,7 @@

                boolean tryDbLoad = false;

-               String suffix = "-" + darknetPortNumber;
+               String suffix = "-" + getDarknetPortNumber();

                // This can take some time
                System.out.println("Starting database...");
@@ -1236,7 +999,7 @@
                                e1.printStackTrace();
                                System.err.println("Previous error was (tried 
deleting database and retrying): "+e);
                                e.printStackTrace();
-                               throw new NodeInitException(EXIT_STORE_OTHER, 
e1.getMessage());
+                               throw new 
NodeInitException(NodeInitException.EXIT_STORE_OTHER, e1.getMessage());
                        }
                }
                storeEnvironment = env;
@@ -1301,7 +1064,7 @@
                } catch (DatabaseException e) {
                        System.err.println("Could not set the database 
configuration: "+e);
                        e.printStackTrace();
-                       throw new NodeInitException(EXIT_STORE_OTHER, 
e.getMessage());                  
+                       throw new 
NodeInitException(NodeInitException.EXIT_STORE_OTHER, e.getMessage());          
              
                }

                try {
@@ -1334,13 +1097,13 @@
                        String msg = "Could not open datastore: "+e1;
                        Logger.error(this, msg, e1);
                        System.err.println(msg);
-                       throw new NodeInitException(EXIT_STORE_FILE_NOT_FOUND, 
msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_STORE_FILE_NOT_FOUND, msg);
                } catch (IOException e1) {
                        String msg = "Could not open datastore: "+e1;
                        Logger.error(this, msg, e1);
                        System.err.println(msg);
                        e1.printStackTrace();
-                       throw new NodeInitException(EXIT_STORE_IOEXCEPTION, 
msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_STORE_IOEXCEPTION, msg);
                } catch (DatabaseException e1) {
                        try {
                                reconstructFile.createNewFile();
@@ -1352,7 +1115,7 @@
                        Logger.error(this, msg, e1);
                        System.err.println(msg);
                        e1.printStackTrace();
-                       throw new NodeInitException(EXIT_STORE_RECONSTRUCT, 
msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_STORE_RECONSTRUCT, msg);
                }

                // FIXME back compatibility
@@ -1373,7 +1136,7 @@

                nodeStats = new NodeStats(this, sortOrder, new 
SubConfig("node.load", config), oldThrottleFS, obwLimit, ibwLimit);

-               clientCore = new NodeClientCore(this, config, nodeConfig, 
nodeDir, darknetPortNumber, sortOrder, oldThrottleFS == null ? null : 
oldThrottleFS.subset("RequestStarters"));
+               clientCore = new NodeClientCore(this, config, nodeConfig, 
nodeDir, getDarknetPortNumber(), sortOrder, oldThrottleFS == null ? null : 
oldThrottleFS.subset("RequestStarters"));

                nodeConfig.register("disableHangCheckers", false, sortOrder++, 
true, false, "Node.disableHangCheckers", "Node.disableHangCheckersLong", new 
BooleanCallback() {

@@ -1433,7 +1196,7 @@
                        nodeUpdater = NodeUpdateManager.maybeCreate(this, 
config);
                } catch (InvalidConfigValueException e) {
                        e.printStackTrace();
-                       throw new 
NodeInitException(EXIT_COULD_NOT_START_UPDATER, "Could not create Updater: "+e);
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_UPDATER, "Could not 
create Updater: "+e);
                }

                Logger.normal(this, "Node constructor completed");
@@ -1451,7 +1214,7 @@
                nodeStats.start();

                usm.start(ps);
-               ((UdpSocketHandler)darknetSocket).start(disableHangCheckers);
+               darknetCrypto.start(disableHangCheckers);

                if(isUsingWrapper()) {
                        Logger.normal(this, "Using wrapper correctly: 
"+nodeStarter);
@@ -1462,8 +1225,8 @@
                }
                Logger.normal(this, "Freenet 0.7 Build 
#"+Version.buildNumber()+" r"+Version.cvsRevision);
                System.out.println("Freenet 0.7 Build 
#"+Version.buildNumber()+" r"+Version.cvsRevision);
-               Logger.normal(this, "FNP port is on "+bindto+ ':' 
+darknetPortNumber);
-               System.out.println("FNP port is on "+bindto+ ':' 
+darknetPortNumber);
+               Logger.normal(this, "FNP port is on "+darknetCrypto.bindto+ ':' 
+getDarknetPortNumber());
+               System.out.println("FNP port is on "+darknetCrypto.bindto+ ':' 
+getDarknetPortNumber());
                // Start services

 //             SubConfig pluginManagerConfig = new SubConfig("pluginmanager3", 
config);
@@ -1477,7 +1240,7 @@
                        nodeUpdater.start();
                }catch (Exception e) {
                        e.printStackTrace();
-                       throw new 
NodeInitException(EXIT_COULD_NOT_START_UPDATER, "Could not start Updater: "+e);
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_UPDATER, "Could not 
start Updater: "+e);
                }

                // Start testnet handler
@@ -1694,8 +1457,7 @@

        public SimpleFieldSet exportPrivateFieldSet() {
                SimpleFieldSet fs = exportPublicFieldSet(false);
-               fs.put("dsaPrivKey", darknetPrivKey.asFieldSet());
-               fs.putSingle("ark.privURI", 
this.darknetARK.getInsertURI().toString(false, false));
+               darknetCrypto.addPrivateFields(fs);
                return fs;
        }

@@ -1715,7 +1477,7 @@
         * or that can safely be exchanged later.
         */
        SimpleFieldSet exportPublicFieldSet(boolean forSetup) {
-               SimpleFieldSet fs = new SimpleFieldSet(true);
+               SimpleFieldSet fs = 
darknetCrypto.exportPublicFieldSet(forSetup);
                // IP addresses
                Peer[] ips = ipDetector.getPrimaryIPAddress();
                if(ips != null) {
@@ -1723,9 +1485,6 @@
                                fs.putAppend("physical.udp", 
ips[i].toString()); // Keep; important that node know all our IPs
                }
                // Negotiation types
-               int[] negTypes = darknetPacketMangler.supportedNegTypes();
-               fs.put("auth.negTypes", negTypes);
-               fs.putSingle("identity", Base64.encode(myIdentity)); // FIXME 
!forSetup after 11104 is mandatory
                fs.put("location", lm.getLocation().getValue()); // FIXME maybe 
!forSetup; see #943
                fs.putSingle("version", Version.getVersionString()); // Keep, 
vital that peer know our version. For example, some types may be sent in 
different formats to different node versions (e.g. Peer).
                fs.put("testnet", testnetEnabled); // Vital that peer know this!
@@ -1733,33 +1492,14 @@
                if(testnetEnabled)
                        fs.put("testnetPort", testnetHandler.getPort()); // 
Useful, saves a lot of complexity
                fs.putSingle("myName", myName); // FIXME see #942
-               if(!forSetup) {
-                       // These are invariant. They cannot change on 
connection setup. They can safely be excluded.
-                       fs.put("dsaGroup", darknetCryptoGroup.asFieldSet());
-                       fs.put("dsaPubKey", darknetPubKey.asFieldSet());
-               }
-               fs.put("ark.number", darknetARKNumber); // Can be changed on 
setup
-               fs.putSingle("ark.pubURI", 
this.darknetARK.getURI().toString(false, false)); // Can be changed on setup

                synchronized (referenceSync) {
                        if(myReferenceSignature == null || mySignedReference == 
null || !mySignedReference.equals(fs.toOrderedString())){
                                mySignedReference = fs.toOrderedString();
-                               if(logMINOR) Logger.minor(this, "Signing 
reference:\n"+mySignedReference);
-
-                               try{
-                                       byte[] ref = 
mySignedReference.getBytes("UTF-8");
-                                       BigInteger m = new BigInteger(1, 
SHA256.digest(ref));
-                                       if(logMINOR) Logger.minor(this, "m = 
"+m.toString(16));
-                                       myReferenceSignature = 
DSA.sign(darknetCryptoGroup, darknetPrivKey, m, random);
-                                       // FIXME remove this ... eventually
-                                       if(!DSA.verify(darknetPubKey, 
myReferenceSignature, m, false))
-                                               Logger.error(this, "Signature 
failed!");
-                               } 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);
+                               try {
+                                       myReferenceSignature = 
darknetCrypto.signRef(mySignedReference);
+                               } catch (NodeInitException e) {
+                                       exit(e.exitCode);
                                }
                        }
                        fs.putSingle("sig", 
myReferenceSignature.toLongString());
@@ -1818,7 +1558,7 @@
         */
        public Object makeRequestSender(Key key, short htl, long uid, PeerNode 
source, double closestLocation, boolean resetClosestLocation, boolean 
localOnly, boolean cache, boolean ignoreStore) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
-               if(logMINOR) Logger.minor(this, "makeRequestSender("+key+ ',' 
+htl+ ',' +uid+ ',' +source+") on "+darknetPortNumber);
+               if(logMINOR) Logger.minor(this, "makeRequestSender("+key+ ',' 
+htl+ ',' +uid+ ',' +source+") on "+getDarknetPortNumber());
                // In store?
                KeyBlock chk = null;
                if(!ignoreStore) {
@@ -2573,18 +2313,10 @@
                ipDetector.onConnectedPeer();
        }

-       public String getBindTo(){
-               return this.bindto;
-       }
-       
        public int getFNPPort(){
-               return this.darknetPortNumber;
+               return this.getDarknetPortNumber();
        }

-       public int getIdentityHash(){
-               return Fields.hashCode(identityHash);
-       }
-       
        public synchronized boolean setNewestPeerLastGoodVersion( int version ) 
{
                if( version > buildOldAgeUserAlert.lastGoodVersion ) {
                        if( buildOldAgeUserAlert.lastGoodVersion == 0 ) {
@@ -2815,14 +2547,6 @@
                 config.get("node").getOption("name").setValue(key);
        }

-       protected DSAPrivateKey getDarknetPrivKey() {
-               return darknetPrivKey;
-       }
-
-       protected DSAPublicKey getDarknetPubKey() {
-               return darknetPubKey;
-       }
-
        public Ticker getTicker() {
                return ps;
        }
@@ -2835,7 +2559,7 @@
         * Connect this node to another node (for purposes of testing) 
         */
        public void connect(Node node) throws FSParseException, 
PeerParseException, ReferenceSignatureVerificationException {
-               peers.connect(node.exportPublicFieldSet(), 
darknetPacketMangler);
+               peers.connect(node.exportPublicFieldSet(), 
darknetCrypto.packetMangler);
        }

        public short maxHTL() {
@@ -2843,7 +2567,7 @@
        }

        public int getDarknetPortNumber() {
-               return darknetPortNumber;
+               return darknetCrypto.portNumber;
        }

        public void JEStatsDump() {
@@ -2865,11 +2589,6 @@
                return inputBandwidthLimit;
        }

-       /** Sign a hash */
-       DSASignature sign(byte[] hash) {
-               return DSA.sign(darknetCryptoGroup, darknetPrivKey, new 
NativeBigInteger(1, hash), random);
-       }
-       
        public synchronized void setTimeSkewDetectedUserAlert() {
                if(timeSkewDetectedUserAlert == null) {
                        timeSkewDetectedUserAlert = new 
TimeSkewDetectedUserAlert();
@@ -2880,4 +2599,16 @@
        public File getNodeDir() {
                return nodeDir;
        }
+
+       public DarknetPeerNode createNewDarknetNode(SimpleFieldSet fs) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+       return new DarknetPeerNode(fs, this, darknetCrypto, peers, false, 
darknetCrypto.packetMangler);
+       }
+
+       public byte[] getDarknetIdentity() {
+               return darknetCrypto.myIdentity;
+       }
+
+       public int estimateFullHeadersLengthOneMessage() {
+               return 
darknetCrypto.packetMangler.fullHeadersLengthOneMessage();
+       }
 }

Modified: trunk/freenet/src/freenet/node/NodeARKInserter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeARKInserter.java 2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeARKInserter.java 2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -29,6 +29,7 @@
         * 
         */
        private final Node node;
+       private final NodeCrypto crypto;
        private final NodeIPDetector detector;
        private static boolean logMINOR;

@@ -36,8 +37,9 @@
         * @param node
         * @param old If true, use the old ARK rather than the new ARK
         */
-       NodeARKInserter(Node node, NodeIPDetector detector) {
+       NodeARKInserter(Node node, NodeCrypto crypto, NodeIPDetector detector) {
                this.node = node;
+               this.crypto = crypto;
                this.detector = detector;
                logMINOR = Logger.shouldLog(Logger.MINOR, this);
        }
@@ -128,8 +130,8 @@

                Bucket b = new SimpleReadOnlyArrayBucket(buf);

-               long number = node.darknetARKNumber;
-               InsertableClientSSK ark = node.darknetARK;
+               long number = crypto.myARKNumber;
+               InsertableClientSSK ark = crypto.myARK;
                FreenetURI uri = 
ark.getInsertURI().setKeyType("USK").setSuggestedEdition(number);

                if(logMINOR) Logger.minor(this, "Inserting ARK: "+uri);
@@ -210,12 +212,12 @@
        public void onGeneratedURI(FreenetURI uri, BaseClientPutter state) {
                if(logMINOR) Logger.minor(this, "Generated URI for ARK: "+uri);
                long l = uri.getSuggestedEdition();
-               if(l < this.node.darknetARKNumber) {
-                       Logger.error(this, "Inserted edition # lower than 
attempted: "+l+" expected "+this.node.darknetARKNumber);
-               } else if(l > this.node.darknetARKNumber) {
-                       if(logMINOR) Logger.minor(this, "ARK number moving from 
"+this.node.darknetARKNumber+" to "+l);
-                       this.node.darknetARKNumber = l;
-                       this.node.writeNodeFile();
+               if(l < crypto.myARKNumber) {
+                       Logger.error(this, "Inserted edition # lower than 
attempted: "+l+" expected "+crypto.myARKNumber);
+               } else if(l > crypto.myARKNumber) {
+                       if(logMINOR) Logger.minor(this, "ARK number moving from 
"+crypto.myARKNumber+" to "+l);
+                       crypto.myARKNumber = l;
+                       node.writeNodeFile();
                }
        }


Modified: trunk/freenet/src/freenet/node/NodeClientCore.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeClientCore.java  2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeClientCore.java  2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -40,7 +40,6 @@
 import freenet.keys.SSKBlock;
 import freenet.keys.SSKVerifyException;
 import freenet.l10n.L10n;
-import freenet.node.Node.NodeInitException;
 import freenet.node.fcp.FCPServer;
 import freenet.node.useralerts.UserAlertManager;
 import freenet.store.KeyCollisionException;
@@ -158,14 +157,14 @@
                tempDir = new File(nodeConfig.getString("tempDir"));
                if(!((tempDir.exists() && tempDir.isDirectory()) || 
(tempDir.mkdir()))) {
                        String msg = "Could not find or create temporary 
directory";
-                       throw new NodeInitException(Node.EXIT_BAD_TEMP_DIR, 
msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
                }

                try {
                        tempFilenameGenerator = new FilenameGenerator(random, 
true, tempDir, "temp-");
                } catch (IOException e) {
                        String msg = "Could not find or create temporary 
directory (filename generator)";
-                       throw new NodeInitException(Node.EXIT_BAD_TEMP_DIR, 
msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
                }

                // Persistent temp files
@@ -186,7 +185,7 @@
                        persistentEncryptedTempBucketFactory = new 
PersistentEncryptedTempBucketFactory(persistentTempBucketFactory);
                } catch (IOException e2) {
                        String msg = "Could not find or create persistent 
temporary directory";
-                       throw new NodeInitException(Node.EXIT_BAD_TEMP_DIR, 
msg);
+                       throw new 
NodeInitException(NodeInitException.EXIT_BAD_TEMP_DIR, msg);
                }

                tempBucketFactory = new 
PaddedEphemerallyEncryptedBucketFactory(new 
TempBucketFactory(tempFilenameGenerator), random, 1024);
@@ -215,7 +214,7 @@
                String val = nodeConfig.getString("downloadsDir");
                downloadDir = new File(val);
                if(!((downloadDir.exists() && downloadDir.isDirectory()) || 
(downloadDir.mkdir()))) {
-                       throw new 
NodeInitException(Node.EXIT_BAD_DOWNLOADS_DIR, "Could not find or create 
default downloads directory");
+                       throw new 
NodeInitException(NodeInitException.EXIT_BAD_DOWNLOADS_DIR, "Could not find or 
create default downloads directory");
                }

                // Downloads allowed, uploads allowed
@@ -417,16 +416,16 @@
                        TextModeClientInterfaceServer.maybeCreate(node, config);
                } catch (IOException e) {
                        e.printStackTrace();
-                       throw new 
NodeInitException(Node.EXIT_COULD_NOT_START_TMCI, "Could not start TMCI: "+e);
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_TMCI, "Could not start 
TMCI: "+e);
                }

                // FCP (including persistent requests so needs to start before 
FProxy)
                try {
                        fcpServer = FCPServer.maybeCreate(node, this, 
node.config);
                } catch (IOException e) {
-                       throw new 
NodeInitException(Node.EXIT_COULD_NOT_START_FCP, "Could not start FCP: "+e);
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FCP, "Could not start 
FCP: "+e);
                } catch (InvalidConfigValueException e) {
-                       throw new 
NodeInitException(Node.EXIT_COULD_NOT_START_FCP, "Could not start FCP: "+e);
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FCP, "Could not start 
FCP: "+e);
                }

                SubConfig fproxyConfig = new SubConfig("fproxy", config);
@@ -438,9 +437,9 @@
                        FProxyToadlet.maybeCreateFProxyEtc(this, node, config, 
fproxyConfig);
                } catch (IOException e) {
                        e.printStackTrace();
-                       throw new 
NodeInitException(Node.EXIT_COULD_NOT_START_FPROXY, "Could not start FProxy: 
"+e);
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FPROXY, "Could not 
start FProxy: "+e);
                } catch (InvalidConfigValueException e) {
-                       throw new 
NodeInitException(Node.EXIT_COULD_NOT_START_FPROXY, "Could not start FProxy: 
"+e);
+                       throw new 
NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FPROXY, "Could not 
start FProxy: "+e);
                }

                Thread completer = new Thread(new Runnable() {

Added: trunk/freenet/src/freenet/node/NodeCrypto.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeCrypto.java                              
(rev 0)
+++ trunk/freenet/src/freenet/node/NodeCrypto.java      2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -0,0 +1,304 @@
+package freenet.node;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.security.MessageDigest;
+
+import net.i2p.util.NativeBigInteger;
+
+import freenet.config.InvalidConfigValueException;
+import freenet.config.SubConfig;
+import freenet.crypt.DSA;
+import freenet.crypt.DSAGroup;
+import freenet.crypt.DSAPrivateKey;
+import freenet.crypt.DSAPublicKey;
+import freenet.crypt.DSASignature;
+import freenet.crypt.Global;
+import freenet.crypt.RandomSource;
+import freenet.crypt.SHA256;
+import freenet.io.comm.UdpSocketHandler;
+import freenet.keys.FreenetURI;
+import freenet.keys.InsertableClientSSK;
+import freenet.support.Base64;
+import freenet.support.Fields;
+import freenet.support.IllegalBase64Exception;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
+import freenet.support.api.IntCallback;
+import freenet.support.api.StringCallback;
+
+/**
+ * Cryptographic and transport level node identity. 
+ * @author toad
+ */
+class NodeCrypto {
+
+       final RandomSource random;
+       /** The object which handles our specific UDP port, pulls messages from 
it, feeds them to the packet mangler for decryption etc */
+       UdpSocketHandler socket;
+       public FNPPacketMangler packetMangler;
+       final String bindto;
+       // FIXME: abstract out address stuff? Possibly to something like 
NodeReference?
+       final int portNumber;
+       byte[] myIdentity; // FIXME: simple identity block; should be unique
+       /** Hash of identity. Used as setup key. */
+       byte[] identityHash;
+       /** Hash of hash of identity i.e. hash of setup key. */
+       byte[] identityHashHash;
+       /** My crypto group */
+       private DSAGroup cryptoGroup;
+       /** My private key */
+       private DSAPrivateKey privKey;
+       /** My public key */
+       private DSAPublicKey pubKey;
+       /** My ARK SSK private key */
+       InsertableClientSSK myARK;
+       /** My ARK sequence number */
+       long myARKNumber;
+       static boolean logMINOR;
+       
+       /**
+        * Get port number from a config, create socket and packet mangler
+        * @throws NodeInitException 
+        */
+       public NodeCrypto(SubConfig nodeConfig, int sortOrder, Node node) 
throws NodeInitException {
+               
+               random = node.random;
+               logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               
+               nodeConfig.register("listenPort", -1 /* means random */, 
sortOrder++, true, true, "Node.port", "Node.portLong", new IntCallback() {
+                       public int get() {
+                               return portNumber;
+                       }
+                       public void set(int val) throws 
InvalidConfigValueException {
+                               // FIXME implement on the fly listenPort 
changing
+                               // Note that this sort of thing should be the 
exception rather than the rule!!!!
+                               String msg = "Switching listenPort on the fly 
not yet supported!";
+                               Logger.error(this, msg);
+                               throw new InvalidConfigValueException(msg);
+                       }
+               });
+               
+               int port=-1;
+               try{
+                       port=nodeConfig.getInt("listenPort");
+               }catch (Exception e){
+                       Logger.error(this, "Caught "+e, e);
+                       System.err.println(e);
+                       e.printStackTrace();
+                       port=-1;
+               }
+               
+               nodeConfig.register("bindTo", "0.0.0.0", sortOrder++, true, 
true, "Node.bindTo", "Node.bindToLong", new NodeBindtoCallback());
+               
+               this.bindto = nodeConfig.getString("bindTo");
+               
+               UdpSocketHandler u = null;
+               
+               if(port > 65535) {
+                       throw new 
NodeInitException(NodeInitException.EXIT_IMPOSSIBLE_USM_PORT, "Impossible port 
number: "+port);
+               } else if(port == -1) {
+                       // Pick a random port
+                       for(int i=0;i<200000;i++) {
+                               int portNo = 1024 + random.nextInt(65535-1024);
+                               try {
+                                       u = new UdpSocketHandler(portNo, 
InetAddress.getByName(bindto), node);
+                                       port = u.getPortNumber();
+                                       break;
+                               } catch (Exception e) {
+                                       Logger.normal(this, "Could not use 
port: "+bindto+ ':' +portNo+": "+e, e);
+                                       System.err.println("Could not use port: 
"+bindto+ ':' +portNo+": "+e);
+                                       e.printStackTrace();
+                                       continue;
+                               }
+                       }
+                       if(u == null)
+                               throw new 
NodeInitException(NodeInitException.EXIT_NO_AVAILABLE_UDP_PORTS, "Could not 
find an available UDP port number for FNP (none specified)");
+               } else {
+                       try {
+                               u = new UdpSocketHandler(port, 
InetAddress.getByName(bindto), node);
+                       } catch (Exception e) {
+                               throw new 
NodeInitException(NodeInitException.EXIT_IMPOSSIBLE_USM_PORT, "Could not bind 
to port: "+port+" (node already running?)");
+                       }
+               }
+               socket = u;
+               
+               Logger.normal(this, "FNP port created on "+bindto+ ':' +port);
+               System.out.println("FNP port created on "+bindto+ ':' +port);
+               portNumber = port;
+               
+               nodeConfig.register("testingDropPacketsEvery", 0, sortOrder++, 
true, false, "Node.dropPacketEvery", "Node.dropPacketEveryLong",
+                               new IntCallback() {
+
+                                       public int get() {
+                                               return 
((UdpSocketHandler)socket).getDropProbability();
+                                       }
+
+                                       public void set(int val) throws 
InvalidConfigValueException {
+                                               
((UdpSocketHandler)socket).setDropProbability(val);
+                                       }
+                       
+               });
+               
+               int dropProb = nodeConfig.getInt("testingDropPacketsEvery");
+               ((UdpSocketHandler)socket).setDropProbability(dropProb);
+               
+               socket.setLowLevelFilter(packetMangler = new 
FNPPacketMangler(node, this, socket));
+       }
+       
+       class NodeBindtoCallback implements StringCallback {
+               
+               public String get() {
+                       return bindto;
+               }
+               
+               public void set(String val) throws InvalidConfigValueException {
+                       if(val.equals(get())) return;
+                       // FIXME why not? Can't we use 
freenet.io.NetworkInterface like everywhere else, just adapt it for UDP?
+                       throw new InvalidConfigValueException("Cannot be 
updated on the fly");
+               }
+       }
+
+       /**
+        * Read the cryptographic keys etc from a SimpleFieldSet
+        * @param fs
+        * @throws IOException 
+        */
+       public void readCrypto(SimpleFieldSet fs) throws IOException {
+               String identity = fs.get("identity");
+               if(identity == null)
+                       throw new IOException();
+               try {
+                       myIdentity = Base64.decode(identity);
+               } catch (IllegalBase64Exception e2) {
+                       throw new IOException();
+               }
+               identityHash = SHA256.digest(myIdentity);
+               identityHashHash = SHA256.digest(identityHash);
+               
+               try {
+                       cryptoGroup = DSAGroup.create(fs.subset("dsaGroup"));
+                       privKey = DSAPrivateKey.create(fs.subset("dsaPrivKey"), 
cryptoGroup);
+                       pubKey = DSAPublicKey.create(fs.subset("dsaPubKey"), 
cryptoGroup);
+               } catch (IllegalBase64Exception e) {
+                       if(logMINOR) Logger.minor(this, "Caught "+e, e);
+                       this.cryptoGroup = Global.DSAgroupBigA;
+                       this.privKey = new DSAPrivateKey(cryptoGroup, random);
+                       this.pubKey = new DSAPublicKey(cryptoGroup, privKey);
+               }
+               InsertableClientSSK ark = null;
+               
+               // ARK
+               
+               String s = fs.get("ark.number");
+               
+               String privARK = fs.get("ark.privURI");
+               try {
+                       if(privARK != null) {
+                               FreenetURI uri = new FreenetURI(privARK);
+                               ark = InsertableClientSSK.create(uri);
+                               if(ark.isInsecure() || s == null) {
+                                       if(ark.isInsecure())
+                                               System.out.println("Creating 
new ARK, old is insecure");
+                                       ark = null;
+                                       myARKNumber = 0;
+                               } else {
+                                       try {
+                                               myARKNumber = Long.parseLong(s);
+                                       } catch (NumberFormatException e) {
+                                               myARKNumber = 0;
+                                               ark = null;
+                                       }
+                               }
+                       }
+               } catch (MalformedURLException e) {
+                       Logger.minor(this, "Caught "+e, e);
+                       ark = null;
+               }
+               if(ark == null) {
+                       ark = InsertableClientSSK.createRandom(random, "ark");
+                       myARKNumber = 0;
+               }
+               myARK = ark;
+
+       }
+
+       /**
+        * Create the cryptographic keys etc from scratch
+        */
+       public void initCrypto() {
+               myIdentity = new byte[32];
+               random.nextBytes(myIdentity);
+               MessageDigest md = SHA256.getMessageDigest();
+               identityHash = md.digest(myIdentity);
+               identityHashHash = md.digest(identityHash);
+               cryptoGroup = Global.DSAgroupBigA;
+               privKey = new DSAPrivateKey(cryptoGroup, random);
+               pubKey = new DSAPublicKey(cryptoGroup, privKey);
+               myARK = InsertableClientSSK.createRandom(random, "ark");
+               myARKNumber = 0;
+               SHA256.returnMessageDigest(md);
+       }
+
+       public void start(boolean disableHangchecker) {
+               socket.start(disableHangchecker);
+       }
+
+       SimpleFieldSet exportPublicFieldSet(boolean forSetup) {
+               SimpleFieldSet fs = new SimpleFieldSet(true);
+               int[] negTypes = packetMangler.supportedNegTypes();
+               fs.put("auth.negTypes", negTypes);
+               fs.putSingle("identity", Base64.encode(myIdentity)); // FIXME 
!forSetup after 11104 is mandatory
+               if(!forSetup) {
+                       // These are invariant. They cannot change on 
connection setup. They can safely be excluded.
+                       fs.put("dsaGroup", cryptoGroup.asFieldSet());
+                       fs.put("dsaPubKey", pubKey.asFieldSet());
+               }
+               fs.put("ark.number", myARKNumber); // Can be changed on setup
+               fs.putSingle("ark.pubURI", myARK.getURI().toString(false, 
false)); // Can be changed on setup
+               return fs;
+       }
+
+       DSASignature signRef(String mySignedReference) throws NodeInitException 
{
+               if(logMINOR) Logger.minor(this, "Signing 
reference:\n"+mySignedReference);
+
+               try{
+                       byte[] ref = mySignedReference.getBytes("UTF-8");
+                       BigInteger m = new BigInteger(1, SHA256.digest(ref));
+                       if(logMINOR) Logger.minor(this, "m = "+m.toString(16));
+                       DSASignature myReferenceSignature = 
DSA.sign(cryptoGroup, privKey, m, random);
+                       // FIXME remove this ... eventually
+                       if(!DSA.verify(pubKey, myReferenceSignature, m, false))
+                               Logger.error(this, "Signature failed!");
+                       return myReferenceSignature;
+               } 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();
+                       throw new 
NodeInitException(NodeInitException.EXIT_CRAPPY_JVM, "UTF-8 not supported!");
+               }
+       }
+
+       void addPrivateFields(SimpleFieldSet fs) {
+               fs.put("dsaPrivKey", privKey.asFieldSet());
+               fs.putSingle("ark.privURI", 
myARK.getInsertURI().toString(false, false));
+       }
+
+       public String getBindTo(){
+               return this.bindto;
+       }
+       
+       public int getIdentityHash(){
+               return Fields.hashCode(identityHash);
+       }
+
+       /** Sign a hash */
+       DSASignature sign(byte[] hash) {
+               return DSA.sign(cryptoGroup, privKey, new NativeBigInteger(1, 
hash), random);
+       }
+       
+}

Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java  2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java  2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -234,12 +234,12 @@
                long now = System.currentTimeMillis();
                if(m.getSpec().equals(DMT.FNPSSKInsertRequest)) {
                        SSKInsertHandler rh = new SSKInsertHandler(m, id, node, 
now);
-                       Thread t = new Thread(rh, "InsertHandler for "+id+" on 
"+node.darknetPortNumber);
+                       Thread t = new Thread(rh, "InsertHandler for "+id+" on 
"+node.getDarknetPortNumber());
                        t.setDaemon(true);
                        t.start();
                } else {
                        InsertHandler rh = new InsertHandler(m, id, node, now);
-                       Thread t = new Thread(rh, "InsertHandler for "+id+" on 
"+node.darknetPortNumber);
+                       Thread t = new Thread(rh, "InsertHandler for "+id+" on 
"+node.getDarknetPortNumber());
                        t.setDaemon(true);
                        t.start();
                }
@@ -326,7 +326,7 @@
                double target = m.getDouble(DMT.TARGET_LOCATION);
                if(logMINOR) Logger.minor(this, "id "+id+" from "+pn+" htl 
"+htl+" target "+target);
                if(Math.abs(node.lm.getLocation().getValue() - target) <= 
Double.MIN_VALUE) {
-                       if(logMINOR) Logger.minor(this, "Dispatching 
"+m.getSpec()+" on "+node.darknetPortNumber);
+                       if(logMINOR) Logger.minor(this, "Dispatching 
"+m.getSpec()+" on "+node.getDarknetPortNumber());
                        // Handle locally
                        // Message type specific processing
                        dispatchRoutedMessage(m, pn, id);
@@ -380,7 +380,7 @@
                                        continue;
                                }
                        } else {
-                               if(logMINOR) Logger.minor(this, "Reached dead 
end for "+m.getSpec()+" on "+node.darknetPortNumber);
+                               if(logMINOR) Logger.minor(this, "Reached dead 
end for "+m.getSpec()+" on "+node.getDarknetPortNumber());
                                // Reached a dead end...
                                Message reject = 
DMT.createFNPRoutedRejected(id, htl);
                                if(pn != null) try {

Modified: trunk/freenet/src/freenet/node/NodeIPDetector.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeIPDetector.java  2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeIPDetector.java  2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -28,6 +28,7 @@

        /** Parent node */
        final Node node;
+       final NodeCrypto crypto;
        /** Ticker */
        final Ticker ticker;
        /** Explicit forced IP address */
@@ -59,13 +60,14 @@

        SimpleUserAlert maybeSymmetricAlert;

-       public NodeIPDetector(Node node) {
+       public NodeIPDetector(Node node, NodeCrypto crypto) {
                this.node = node;
+               this.crypto = crypto;
                this.ticker = node.ps;
                ipDetectorManager = new IPDetectorPluginManager(node, this);
                ipDetector = new IPAddressDetector(10*1000, this);
                primaryIPUndetectedAlert = new IPUndetectedUserAlert(node);
-               arkPutter = new NodeARKInserter(node, this);
+               arkPutter = new NodeARKInserter(node, crypto, this);
        }

        /**
@@ -76,28 +78,29 @@
         */
        Peer[] detectPrimaryIPAddress() {
                boolean addedValidIP = false;
+               int portNumber = crypto.portNumber;
                Logger.minor(this, "Redetecting IPs...");
                Vector addresses = new Vector();
                if(overrideIPAddress != null) {
                        // If the IP is overridden, the override has to be the 
first element.
-                       Peer p = new Peer(overrideIPAddress, 
node.darknetPortNumber);
+                       Peer p = new Peer(overrideIPAddress, portNumber);
                        addresses.add(p);
                        if(p.getFreenetAddress().isRealInternetAddress(false, 
true))
                                addedValidIP = true;
                }
                boolean dontDetect = false;
-               UdpSocketHandler sock = node.darknetSocket;
+               UdpSocketHandler sock = crypto.socket;
                if(sock != null) {
                        InetAddress addr = sock.getBindTo();
                        if(addr != null && (IPUtil.isValidAddress(addr, 
false))) {
                                dontDetect = true;
-                               Peer p = new Peer(addr, node.darknetPortNumber);
+                               Peer p = new Peer(addr, portNumber);
                                if(!addresses.contains(p)) addresses.add(p);
                                dontDetect = true;
                        }
                }
                if(!dontDetect) {
-                       addedValidIP = innerDetect(addresses, addedValidIP);
+                       addedValidIP = innerDetect(addresses, addedValidIP, 
portNumber);
                }
                if(node.clientCore != null) {
                        if (addedValidIP) {
@@ -110,7 +113,7 @@
                return lastIPAddress;
        }

-       private boolean innerDetect(Vector addresses, boolean addedValidIP) {
+       private boolean innerDetect(Vector addresses, boolean addedValidIP, int 
portNumber) {
                boolean setMaybeSymmetric = false;
                InetAddress[] detectedAddrs = ipDetector.getAddress();
                assert(detectedAddrs != null);
@@ -119,7 +122,7 @@
                }

                for(int i=0;i<detectedAddrs.length;i++) {
-                       Peer p = new Peer(detectedAddrs[i], 
node.darknetPortNumber);
+                       Peer p = new Peer(detectedAddrs[i], portNumber);
                        if(!addresses.contains(p)) {
                                Logger.normal(this, "Detected IP address: "+p);
                                addresses.add(p);
@@ -132,7 +135,7 @@
                        for(int i=0;i<pluginDetectedIPs.length;i++) {
                                InetAddress addr = 
pluginDetectedIPs[i].publicAddress;
                                if(addr == null) continue;
-                               Peer a = new Peer(new FreenetInetAddress(addr), 
node.darknetPortNumber);
+                               Peer a = new Peer(new FreenetInetAddress(addr), 
portNumber);
                                if(!addresses.contains(a)) {
                                        Logger.normal(this, "Plugin detected IP 
address: "+a);
                                        addresses.add(a);
@@ -141,7 +144,7 @@
                        }
                }
                if(addresses.isEmpty() && (oldIPAddress != null) && 
!oldIPAddress.equals(overrideIPAddress))
-                       addresses.add(new Peer(oldIPAddress, 
node.darknetPortNumber));
+                       addresses.add(new Peer(oldIPAddress, portNumber));
                // Try to pick it up from our connections
                if(node.peers != null) {
                        PeerNode[] peerList = node.peers.connectedPeers;
@@ -220,7 +223,7 @@
                                                                                
node.clientCore.alerts.unregister(maybeSymmetricAlert);
                                                                }

-                                                               Peer p = new 
Peer(best.getFreenetAddress(), node.darknetPortNumber);
+                                                               Peer p = new 
Peer(best.getFreenetAddress(), portNumber);
                                                                
if(!addresses.contains(p))
                                                                        
addresses.add(p);
                                                        }

Added: trunk/freenet/src/freenet/node/NodeInitException.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeInitException.java                       
        (rev 0)
+++ trunk/freenet/src/freenet/node/NodeInitException.java       2007-06-28 
20:57:14 UTC (rev 13816)
@@ -0,0 +1,43 @@
+/**
+ * 
+ */
+package freenet.node;
+
+public class NodeInitException extends Exception {
+       // One of the exit codes from above
+       public final int exitCode;
+       public static final int EXIT_BAD_BWLIMIT = 26;
+       public static final int EXIT_TEST_ERROR = 25;
+       public static final int EXIT_RESTART_FAILED = 24;
+       public static final int EXIT_THROTTLE_FILE_ERROR = 23;
+       public static final int EXIT_EXTRA_PEER_DATA_DIR = 22;
+       public static final int EXIT_COULD_NOT_START_UPDATER = 21;
+       public static final int EXIT_DATABASE_REQUIRES_RESTART = 20;
+       public static final int EXIT_CRAPPY_JVM = 255;
+       public static final int EXIT_COULD_NOT_START_TMCI = 19;
+       public static final int EXIT_COULD_NOT_START_FPROXY = 18;
+       public static final int EXIT_COULD_NOT_START_FCP = 17;
+       public static final int EXIT_BAD_TEMP_DIR = 16;
+       public static final int EXIT_BAD_NODE_DIR = 15;
+       public static final int EXIT_BAD_DOWNLOADS_DIR = 14;
+       public static final int EXIT_INVALID_STORE_SIZE = 13;
+       public static final int EXIT_TESTNET_DISABLED_NOT_SUPPORTED = 12;
+       public static final int EXIT_NO_AVAILABLE_UDP_PORTS = 11;
+       public static final int EXIT_IMPOSSIBLE_USM_PORT = 10;
+       public static final int EXIT_COULD_NOT_BIND_USM = 9;
+       public static final int EXIT_MAIN_LOOP_LOST = 8;
+       public static final int EXIT_TESTNET_FAILED = 7;
+       public static final int EXIT_TEMP_INIT_ERROR = 6;
+       public static final int EXIT_YARROW_INIT_FAILED = 5;
+       public static final int EXIT_USM_DIED = 4;
+       public static final int EXIT_STORE_RECONSTRUCT = 27;
+       public static final int EXIT_STORE_OTHER = 3;
+       public static final int EXIT_STORE_IOEXCEPTION = 2;
+       public static final int EXIT_STORE_FILE_NOT_FOUND = 1;
+       private static final long serialVersionUID = -1;
+       
+       NodeInitException(int exitCode, String msg) {
+               super(msg+" ("+exitCode+ ')');
+               this.exitCode = exitCode;
+       }
+}
\ No newline at end of file

Modified: trunk/freenet/src/freenet/node/NodeStarter.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStarter.java     2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeStarter.java     2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -16,7 +16,6 @@
 import freenet.crypt.DiffieHellman;
 import freenet.crypt.RandomSource;
 import freenet.crypt.Yarrow;
-import freenet.node.Node.NodeInitException;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
 import freenet.support.LoggerHook.InvalidThresholdException;
@@ -267,7 +266,7 @@
                File dir = new File(testName);
                if((!dir.mkdir()) && ((!dir.exists()) || (!dir.isDirectory()))) 
{
                        System.err.println("Cannot create directory for test");
-                       System.exit(Node.EXIT_TEST_ERROR);
+                       System.exit(NodeInitException.EXIT_TEST_ERROR);
                }

         Logger.setupStdoutLogging(Logger.MINOR, "");
@@ -332,7 +331,7 @@
                File portDir = new File(baseDir, Integer.toString(port));
                if((!portDir.mkdir()) && ((!portDir.exists()) || 
(!portDir.isDirectory()))) {
                        System.err.println("Cannot create directory for test");
-                       System.exit(Node.EXIT_TEST_ERROR);
+                       System.exit(NodeInitException.EXIT_TEST_ERROR);
                }

                // Set up config for testing

Modified: trunk/freenet/src/freenet/node/NodeStats.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeStats.java       2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/NodeStats.java       2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -11,7 +11,6 @@
 import freenet.io.comm.DMT;
 import freenet.io.comm.IOStatisticCollector;
 import freenet.l10n.L10n;
-import freenet.node.Node.NodeInitException;
 import freenet.support.HTMLNode;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
@@ -304,7 +303,7 @@
                        new TokenBucket(Math.max(ibwLimit*60, 32768*20), 
(int)((1000L*1000L*1000L) / (ibwLimit * 
FRACTION_OF_BANDWIDTH_USED_BY_REQUESTS)), 0);

                estimatedSizeOfOneThrottledPacket = 1024 + 
DMT.packetTransmitSize(1024, 32) + 
-                       node.darknetPacketMangler.fullHeadersLengthOneMessage();
+                       node.estimateFullHeadersLengthOneMessage();
        }

        protected String l10n(String key) {

Modified: trunk/freenet/src/freenet/node/PacketSender.java
===================================================================
--- trunk/freenet/src/freenet/node/PacketSender.java    2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/PacketSender.java    2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -49,7 +49,7 @@
         resendPackets = new LinkedList();
         timedJobsByTime = new TreeMap();
         this.node = node;
-        myThread = new Thread(this, "PacketSender thread for 
"+node.darknetPortNumber);
+        myThread = new Thread(this, "PacketSender thread for 
"+node.getDarknetPortNumber());
         myThread.setDaemon(true);
         myThread.setPriority(Thread.MAX_PRIORITY);
         logMINOR = Logger.shouldLog(Logger.MINOR, this);
@@ -226,7 +226,7 @@
                         if(item == null) continue;
                         try {
                             if(logMINOR) Logger.minor(this, "Resending 
"+item.packetNumber+" to "+item.kt);
-                            node.darknetPacketMangler.resend(item);
+                            pn.getOutgoingMangler().resend(item);
                             mustSend = false;
                         } catch (KeyChangedException e) {
                             Logger.error(this, "Caught "+e+" resending packets 
to "+kt);
@@ -246,7 +246,6 @@

                 }

-                if(node.darknetPacketMangler == null) continue;
                 // Any messages to send?
                 MessageItem[] messages = null;
                 messages = pn.grabQueuedMessageItems();
@@ -267,7 +266,7 @@
                                        if(logMINOR) Logger.minor(this, "PS 
Sending: "+(messages[j].msg == null ? "(not a Message)" : 
messages[j].msg.getSpec().getName()));
                                }
                                // Send packets, right now, blocking, including 
any active notifications
-                               
node.darknetPacketMangler.processOutgoingOrRequeue(messages, pn, true, false);
+                               
pn.getOutgoingMangler().processOutgoingOrRequeue(messages, pn, true, false);
                                continue;
                        }
                 }
@@ -288,14 +287,14 @@
                        // Force packet to have a sequence number.
                        Message m = DMT.createFNPVoid();
                        pn.addToLocalNodeSentMessagesToStatistic(m);
-                       node.darknetPacketMangler.processOutgoingOrRequeue(new 
MessageItem[] { new MessageItem(m, null, 0, null) }, pn, true, true);
+                       pn.getOutgoingMangler().processOutgoingOrRequeue(new 
MessageItem[] { new MessageItem(m, null, 0, null) }, pn, true, true);
                 }
             } else {
                 // Not connected
                 // Send handshake if necessary
                 long beforeHandshakeTime = System.currentTimeMillis();
                 if(pn.shouldSendHandshake())
-                    node.darknetPacketMangler.sendHandshake(pn);
+                    pn.getOutgoingMangler().sendHandshake(pn);
                 if(pn.noContactDetails())
                        pn.startARKFetcher();
                 long afterHandshakeTime = System.currentTimeMillis();

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -93,7 +93,7 @@
      * @param node
      * @param filename
      */
-    public PeerManager(Node node, String filename, OutgoingPacketMangler 
mangler) {
+    public PeerManager(Node node, NodeCrypto crypto, String filename, 
OutgoingPacketMangler mangler) {
         Logger.normal(this, "Creating PeerManager");
         logMINOR = Logger.shouldLog(Logger.MINOR, this);
                peerNodeStatuses = new HashMap();
@@ -107,7 +107,7 @@
         File backupFile = new File(filename+".bak");
         // Try to read the node list from disk
        if(peersFile.exists()) {
-               if(readPeers(peersFile, mangler)) {
+               if(readPeers(peersFile, mangler, crypto)) {
                        String msg = "Read "+myPeers.length+" peers from 
"+peersFile;
                        Logger.normal(this, msg);
                        System.out.println(msg);
@@ -116,7 +116,7 @@
                }
        // Try the backup
        if(backupFile.exists()) {
-               if(readPeers(backupFile, mangler)) {
+               if(readPeers(backupFile, mangler, crypto)) {
                        String msg = "Read "+myPeers.length+" peers from 
"+backupFile;
                        Logger.normal(this, msg);
                        System.out.println(msg);
@@ -127,7 +127,7 @@
        }               
     }

-    private boolean readPeers(File peersFile, OutgoingPacketMangler mangler) {
+    private boolean readPeers(File peersFile, OutgoingPacketMangler mangler, 
NodeCrypto crypto) {
        boolean gotSome = false;
        FileInputStream fis;
                try {
@@ -150,7 +150,7 @@
                 fs = new SimpleFieldSet(br, false, true);
                 PeerNode pn;
                 try {
-                    pn = PeerNode.create(fs, node, this, true, mangler);
+                    pn = PeerNode.create(fs, node, crypto, this, true, 
mangler);
                 } catch (FSParseException e2) {
                     Logger.error(this, "Could not parse peer: "+e2+ '\n' 
+fs.toString(),e2);
                     continue;
@@ -328,7 +328,7 @@
      * Connect to a node provided the fieldset representing it.
      */
     public void connect(SimpleFieldSet noderef, OutgoingPacketMangler mangler) 
throws FSParseException, PeerParseException, 
ReferenceSignatureVerificationException {
-        PeerNode pn = new DarknetPeerNode(noderef, node, this, false, mangler);
+        PeerNode pn = node.createNewDarknetNode(noderef);
         for(int i=0;i<myPeers.length;i++) {
             if(Arrays.equals(myPeers[i].identity, pn.identity)) return;
         }

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -314,7 +314,7 @@
      * @param fs The SimpleFieldSet to parse
      * @param node2 The running Node we are part of.
      */
-    public PeerNode(SimpleFieldSet fs, Node node2, PeerManager peers, boolean 
fromLocal, OutgoingPacketMangler mangler) throws FSParseException, 
PeerParseException, ReferenceSignatureVerificationException {
+    public PeerNode(SimpleFieldSet fs, Node node2, NodeCrypto crypto, 
PeerManager peers, boolean fromLocal, OutgoingPacketMangler mangler) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
        logMINOR = Logger.shouldLog(Logger.MINOR, PeerNode.class);
        myRef = new WeakReference(this);
        this.outgoingMangler = mangler;
@@ -425,7 +425,7 @@
                                Logger.error(this, "Error while signing the 
node identity!"+e);
                                System.err.println("Error while signing the 
node identity!"+e);
                                e.printStackTrace();
-                               node.exit(Node.EXIT_CRAPPY_JVM);
+                               node.exit(NodeInitException.EXIT_CRAPPY_JVM);
                                }
                }else // Local is always good (assumed)
                        this.isSignatureVerificationSuccessfull = true;
@@ -435,8 +435,8 @@
         }

         // Setup incoming and outgoing setup ciphers
-        byte[] nodeKey = node.identityHash;
-        byte[] nodeKeyHash = node.identityHashHash;
+        byte[] nodeKey = crypto.identityHash;
+        byte[] nodeKeyHash = crypto.identityHashHash;

         int digestLength = SHA256.getDigestLength();
         incomingSetupKey = new byte[digestLength];
@@ -446,7 +446,7 @@
         for(int i=0;i<outgoingSetupKey.length;i++)
             outgoingSetupKey[i] = (byte) (nodeKeyHash[i] ^ identityHash[i]);
         if(logMINOR)
-               Logger.minor(this, "Keys:\nIdentity:  
"+HexUtil.bytesToHex(node.myIdentity)+
+               Logger.minor(this, "Keys:\nIdentity:  
"+HexUtil.bytesToHex(crypto.myIdentity)+
                                "\nThisIdent: "+HexUtil.bytesToHex(identity)+
                                "\nNode:      "+HexUtil.bytesToHex(nodeKey)+
                                "\nNode hash: "+HexUtil.bytesToHex(nodeKeyHash)+
@@ -1789,7 +1789,7 @@
             long t = tracker.getNextUrgentTime();
             if(t < now) {
                 try {
-                    node.darknetPacketMangler.processOutgoing(null, 0, 0, 
tracker, 0);
+                    outgoingMangler.processOutgoing(null, 0, 0, tracker, 0);
                 } catch (NotConnectedException e) {
                     // Ignore
                 } catch (KeyChangedException e) {
@@ -1804,7 +1804,7 @@
             long t = tracker.getNextUrgentTime();
             if(t < now) {
                 try {
-                    node.darknetPacketMangler.processOutgoing(null, 0, 0, 
tracker, 0);
+                    outgoingMangler.processOutgoing(null, 0, 0, tracker, 0);
                 } catch (NotConnectedException e) {
                     // Ignore
                 } catch (KeyChangedException e) {
@@ -2647,7 +2647,11 @@
        /**
         * Create a DarknetPeerNode or an OpennetPeerNode as appropriate
         */
-       public static PeerNode create(SimpleFieldSet fs, Node node2, 
PeerManager manager, boolean b, OutgoingPacketMangler mangler) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
-               return new DarknetPeerNode(fs, node2, manager, b, mangler);
+       public static PeerNode create(SimpleFieldSet fs, Node node2, NodeCrypto 
crypto, PeerManager manager, boolean b, OutgoingPacketMangler mangler) throws 
FSParseException, PeerParseException, ReferenceSignatureVerificationException {
+               return new DarknetPeerNode(fs, node2, crypto, manager, b, 
mangler);
        }
+
+       public byte[] getIdentity() {
+               return identity;
+       }
 }

Modified: trunk/freenet/src/freenet/node/SSKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/SSKInsertSender.java 2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/SSKInsertSender.java 2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -97,7 +97,7 @@
     }

     void start() {
-        Thread t = new Thread(this, "SSKInsertSender for UID "+uid+" on 
"+node.darknetPortNumber+" at "+System.currentTimeMillis());
+        Thread t = new Thread(this, "SSKInsertSender for UID "+uid+" on 
"+node.getDarknetPortNumber()+" at "+System.currentTimeMillis());
         t.setDaemon(true);
         t.start();
     }

Modified: trunk/freenet/src/freenet/node/TestnetHandler.java
===================================================================
--- trunk/freenet/src/freenet/node/TestnetHandler.java  2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/TestnetHandler.java  2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -22,7 +22,6 @@
 import freenet.config.InvalidConfigValueException;
 import freenet.config.SubConfig;
 import freenet.l10n.L10n;
-import freenet.node.Node.NodeInitException;
 import freenet.support.FileLoggerHook;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
@@ -83,7 +82,7 @@
                                Logger.normal(this,"Starting testnet server on 
port"+testnetPort);
                        } catch (IOException e) {
                                Logger.error(this, "Could not bind to testnet 
port: "+testnetPort);
-                               node.exit(Node.EXIT_TESTNET_FAILED);
+                               
node.exit(NodeInitException.EXIT_TESTNET_FAILED);
                                return;
                        }
                        while(!server.isClosed()) {
@@ -106,7 +105,7 @@
                                this.testnetPort=port;
                        }catch( IOException e){
                                Logger.error(this, "Error while stopping the 
testnet handler.");
-                               node.exit(Node.EXIT_TESTNET_FAILED);
+                               
node.exit(NodeInitException.EXIT_TESTNET_FAILED);
                                return;
                        }
                }
@@ -255,7 +254,7 @@
         if(enabled) {
                // Get the testnet port

-               testnetConfig.register("port", node.darknetPortNumber+1000, 2, 
true, false, "TestnetHandler.port", "TestnetHandler.portLong",
+               testnetConfig.register("port", 
node.getDarknetPortNumber()+1000, 2, true, false, "TestnetHandler.port", 
"TestnetHandler.portLong",
                                new TestnetPortNumberCallback(node));

                int port = testnetConfig.getInt("port");

Modified: trunk/freenet/src/freenet/node/TextModeClientInterface.java
===================================================================
--- trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-06-28 
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/TextModeClientInterface.java 2007-06-28 
20:57:14 UTC (rev 13816)
@@ -1016,7 +1016,7 @@
         }
         PeerNode pn;
         try {
-            pn = new DarknetPeerNode(fs, n, n.peers, false, 
n.darknetPacketMangler);
+            pn = n.createNewDarknetNode(fs);
         } catch (FSParseException e1) {
             System.err.println("Did not parse: "+e1);
             Logger.error(this, "Did not parse: "+e1, e1);

Modified: trunk/freenet/src/freenet/node/fcp/AddPeer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/AddPeer.java     2007-06-28 19:15:14 UTC 
(rev 13815)
+++ trunk/freenet/src/freenet/node/fcp/AddPeer.java     2007-06-28 20:57:14 UTC 
(rev 13816)
@@ -12,6 +12,7 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.Arrays;

 import freenet.io.comm.PeerParseException;
 import freenet.io.comm.ReferenceSignatureVerificationException;
@@ -112,7 +113,7 @@
                fs.setEndMarker( "End" );
                PeerNode pn;
                try {
-                       pn = new DarknetPeerNode(fs, node, node.peers, false, 
node.darknetPacketMangler);
+                       pn = node.createNewDarknetNode(fs);
                } catch (FSParseException e) {
                        throw new 
MessageInvalidException(ProtocolErrorMessage.REF_PARSE_ERROR, "Error parsing 
ref: "+e.getMessage(), null, false);
                } catch (PeerParseException e) {
@@ -120,9 +121,8 @@
                } catch (ReferenceSignatureVerificationException e) {
                        throw new 
MessageInvalidException(ProtocolErrorMessage.REF_SIGNATURE_INVALID, "Error 
adding ref: "+e.getMessage(), null, false);
                }
-               if(pn.getIdentityHash()==node.getIdentityHash()) {
+               if(Arrays.equals(pn.getIdentity(), node.getDarknetIdentity()))
                        throw new 
MessageInvalidException(ProtocolErrorMessage.CANNOT_PEER_WITH_SELF, "Node 
cannot peer with itself", null, false);
-               }
                if(!node.addDarknetConnection(pn)) {
                        throw new 
MessageInvalidException(ProtocolErrorMessage.DUPLICATE_PEER_REF, "Node already 
has a peer with that identity", null, false);
                }

Modified: trunk/freenet/src/freenet/node/simulator/RealNodePingTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodePingTest.java      
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/simulator/RealNodePingTest.java      
2007-06-28 20:57:14 UTC (rev 13816)
@@ -9,6 +9,7 @@
 import freenet.io.comm.ReferenceSignatureVerificationException;
 import freenet.node.FSParseException;
 import freenet.node.Node;
+import freenet.node.NodeInitException;
 import freenet.node.NodeStarter;
 import freenet.node.PeerNode;
 import freenet.support.Logger;
@@ -26,7 +27,7 @@
  */
 public class RealNodePingTest {

-    public static void main(String[] args) throws FSParseException, 
PeerParseException, InterruptedException, 
ReferenceSignatureVerificationException, Node.NodeInitException, 
InvalidThresholdException {
+    public static void main(String[] args) throws FSParseException, 
PeerParseException, InterruptedException, 
ReferenceSignatureVerificationException, NodeInitException, 
InvalidThresholdException {
         RandomSource random = NodeStarter.globalTestInit("pingtest");
         // Create 2 nodes
         Node node1 = NodeStarter.createTestNode(5001, "pingtest", false, 
false, true, Node.DEFAULT_MAX_HTL, 0, Node.DEFAULT_SWAP_INTERVAL, random);

Modified: 
trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java     
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeRequestInsertTest.java     
2007-06-28 20:57:14 UTC (rev 13816)
@@ -17,8 +17,8 @@
 import freenet.node.FSParseException;
 import freenet.node.LocationManager;
 import freenet.node.Node;
+import freenet.node.NodeInitException;
 import freenet.node.NodeStarter;
-import freenet.node.Node.NodeInitException;
 import freenet.support.Fields;
 import freenet.support.HexUtil;
 import freenet.support.Logger;

Modified: trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java   
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java   
2007-06-28 20:57:14 UTC (rev 13816)
@@ -12,8 +12,8 @@
 import freenet.node.FSParseException;
 import freenet.node.LocationManager;
 import freenet.node.Node;
+import freenet.node.NodeInitException;
 import freenet.node.NodeStarter;
-import freenet.node.Node.NodeInitException;
 import freenet.support.Logger;
 import freenet.support.LoggerHook.InvalidThresholdException;
 import freenet.support.math.BootstrappingDecayingRunningAverage;

Modified: trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java       
2007-06-28 19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/node/updater/NodeUpdateManager.java       
2007-06-28 20:57:14 UTC (rev 13816)
@@ -16,6 +16,7 @@
 import freenet.l10n.L10n;
 import freenet.node.ExtVersion;
 import freenet.node.Node;
+import freenet.node.NodeInitException;
 import freenet.node.NodeStarter;
 import freenet.node.PeerNode;
 import freenet.node.Version;
@@ -565,7 +566,7 @@
                        // Break
                } // in case it's still restarting
                System.err.println("Failed to restart. Exiting, please restart 
the node.");
-               System.exit(Node.EXIT_RESTART_FAILED);
+               System.exit(NodeInitException.EXIT_RESTART_FAILED);
        }

        private void failUpdate(String reason) {

Modified: trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java
===================================================================
--- trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2007-06-28 
19:15:14 UTC (rev 13815)
+++ trunk/freenet/src/freenet/store/BerkeleyDBFreenetStore.java 2007-06-28 
20:57:14 UTC (rev 13816)
@@ -1804,7 +1804,7 @@
                                }
                                Logger.error(this, "Corrupt secondary database 
("+getName()+"). Should be cleaned up on restart.");
                                System.err.println("Corrupt secondary database 
("+getName()+"). Should be cleaned up on restart.");
-                               
System.exit(freenet.node.Node.EXIT_DATABASE_REQUIRES_RESTART);
+                               
System.exit(freenet.node.NodeInitException.EXIT_DATABASE_REQUIRES_RESTART);
                        } else if(ex instanceof DbChecksumException || ex 
instanceof RunRecoveryException) {
                                System.err.println("Corrupt database! Will be 
reconstructed on restart");
                                try {


Reply via email to