Author: toad
Date: 2007-12-14 15:18:21 +0000 (Fri, 14 Dec 2007)
New Revision: 16541
Modified:
trunk/freenet/src/freenet/node/DarknetPeerNode.java
trunk/freenet/src/freenet/node/NodeCrypto.java
trunk/freenet/src/freenet/node/OpennetPeerNode.java
trunk/freenet/src/freenet/node/PeerNode.java
trunk/freenet/src/freenet/node/SeedClientPeerNode.java
trunk/freenet/src/freenet/node/SeedServerPeerNode.java
Log:
Anonymous initiator doesn't need an identity.
Modified: trunk/freenet/src/freenet/node/DarknetPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/DarknetPeerNode.java 2007-12-14 15:02:20 UTC
(rev 16540)
+++ trunk/freenet/src/freenet/node/DarknetPeerNode.java 2007-12-14 15:18:21 UTC
(rev 16541)
@@ -1517,4 +1517,8 @@
public boolean recordStatus() {
return true;
}
+
+ protected boolean generateIdentityFromPubkey() {
+ return false;
+ }
}
Modified: trunk/freenet/src/freenet/node/NodeCrypto.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeCrypto.java 2007-12-14 15:02:20 UTC
(rev 16540)
+++ trunk/freenet/src/freenet/node/NodeCrypto.java 2007-12-14 15:18:21 UTC
(rev 16541)
@@ -328,9 +328,12 @@
SimpleFieldSet exportPublicCryptoFieldSet(boolean forSetup, boolean
forAnonInitiator) {
SimpleFieldSet fs = new SimpleFieldSet(true);
int[] negTypes = packetMangler.supportedNegTypes();
+ if(!(forSetup || forAnonInitiator))
+ // Can't change on setup.
+ // Anonymous initiator doesn't need identity as we
don't use it.
+ fs.putSingle("identity", Base64.encode(myIdentity));
if(!forSetup) {
// These are invariant. They cannot change on
connection setup. They can safely be excluded.
- fs.putSingle("identity", Base64.encode(myIdentity));
fs.put("dsaGroup", cryptoGroup.asFieldSet());
fs.put("dsaPubKey", pubKey.asFieldSet());
}
Modified: trunk/freenet/src/freenet/node/OpennetPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetPeerNode.java 2007-12-14 15:02:20 UTC
(rev 16540)
+++ trunk/freenet/src/freenet/node/OpennetPeerNode.java 2007-12-14 15:18:21 UTC
(rev 16541)
@@ -80,5 +80,9 @@
public boolean recordStatus() {
return true;
}
+
+ protected boolean generateIdentityFromPubkey() {
+ return false;
+ }
}
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2007-12-14 15:02:20 UTC
(rev 16540)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2007-12-14 15:18:21 UTC
(rev 16541)
@@ -301,6 +301,14 @@
private static boolean logMINOR;
/**
+ * If this returns true, we will generate the identity from the pubkey.
+ * Only set this if you don't want to send an identity, e.g. for
anonymous
+ * initiator crypto where we need a small noderef and we don't use the
+ * identity anyway because we don't auto-reconnect.
+ */
+ protected abstract boolean generateIdentityFromPubkey();
+
+ /**
* Create a PeerNode from a SimpleFieldSet containing a
* node reference for one. This must contain the following
* fields:
@@ -322,23 +330,6 @@
this.node = node2;
this.peers = peers;
this.backedOffPercent = new TimeDecayingRunningAverage(0.0,
180000, 0.0, 1.0, node);
- String identityString = fs.get("identity");
- if(identityString == null)
- throw new PeerParseException("No identity!");
- try {
- identity = Base64.decode(identityString);
- } catch(NumberFormatException e) {
- throw new FSParseException(e);
- } catch(IllegalBase64Exception e) {
- throw new FSParseException(e);
- }
-
- if(identity == null)
- throw new FSParseException("No identity");
- identityHash = SHA256.digest(identity);
- identityHashHash = SHA256.digest(identityHash);
- swapIdentifier = Fields.bytesToLong(identityHashHash);
- hashCode = Fields.hashCode(identityHash);
version = fs.get("version");
Version.seenVersion(version);
String locationString = fs.get("location");
@@ -363,35 +354,6 @@
throw new PeerParseException(err);
}
- nominalPeer = new Vector();
- try {
- String physical[] = fs.getAll("physical.udp");
- if(physical == null) {
- // Leave it empty
- } else {
- for(int i = 0; i < physical.length; i++) {
- Peer p;
- try {
- p = new Peer(physical[i], true,
true);
- } catch(HostnameSyntaxException e) {
- if(fromLocal)
- Logger.error(this,
"Invalid hostname or IP Address syntax error while parsing peer reference in
local peers list: " + physical[i]);
- System.err.println("Invalid
hostname or IP Address syntax error while parsing peer reference: " +
physical[i]);
- continue;
- }
- if(!nominalPeer.contains(p))
- nominalPeer.addElement(p);
- }
- }
- } catch(Exception e1) {
- throw new FSParseException(e1);
- }
- if(nominalPeer.isEmpty()) {
- Logger.normal(this, "No IP addresses found for identity
'" + Base64.encode(identity) + "', possibly at location '" +
Double.toString(currentLocation) + ": " + userToString());
- detectedPeer = null;
- } else {
- detectedPeer = (Peer) nominalPeer.firstElement();
- }
negTypes = fs.getIntArray("auth.negTypes");
if(negTypes == null || negTypes.length == 0) {
if(fromAnonymousInitiator)
@@ -458,6 +420,30 @@
throw new FSParseException(e);
}
+ // Identifier
+
+ if(!generateIdentityFromPubkey()) {
+ String identityString = fs.get("identity");
+ if(identityString == null)
+ throw new PeerParseException("No identity!");
+ try {
+ identity = Base64.decode(identityString);
+ } catch(NumberFormatException e) {
+ throw new FSParseException(e);
+ } catch(IllegalBase64Exception e) {
+ throw new FSParseException(e);
+ }
+ } else {
+ identity = peerPubKey.asBytesHash();
+ }
+
+ if(identity == null)
+ throw new FSParseException("No identity");
+ identityHash = SHA256.digest(identity);
+ identityHashHash = SHA256.digest(identityHash);
+ swapIdentifier = Fields.bytesToLong(identityHashHash);
+ hashCode = Fields.hashCode(identityHash);
+
// Setup incoming and outgoing setup ciphers
byte[] nodeKey = crypto.identityHash;
byte[] nodeKeyHash = crypto.identityHashHash;
@@ -490,6 +476,36 @@
throw new Error(e1);
}
+ nominalPeer = new Vector();
+ try {
+ String physical[] = fs.getAll("physical.udp");
+ if(physical == null) {
+ // Leave it empty
+ } else {
+ for(int i = 0; i < physical.length; i++) {
+ Peer p;
+ try {
+ p = new Peer(physical[i], true,
true);
+ } catch(HostnameSyntaxException e) {
+ if(fromLocal)
+ Logger.error(this,
"Invalid hostname or IP Address syntax error while parsing peer reference in
local peers list: " + physical[i]);
+ System.err.println("Invalid
hostname or IP Address syntax error while parsing peer reference: " +
physical[i]);
+ continue;
+ }
+ if(!nominalPeer.contains(p))
+ nominalPeer.addElement(p);
+ }
+ }
+ } catch(Exception e1) {
+ throw new FSParseException(e1);
+ }
+ if(nominalPeer.isEmpty()) {
+ Logger.normal(this, "No IP addresses found for identity
'" + Base64.encode(identity) + "', possibly at location '" +
Double.toString(currentLocation) + ": " + userToString());
+ detectedPeer = null;
+ } else {
+ detectedPeer = (Peer) nominalPeer.firstElement();
+ }
+
// Don't create trackers until we have a key
currentTracker = null;
previousTracker = null;
Modified: trunk/freenet/src/freenet/node/SeedClientPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/SeedClientPeerNode.java 2007-12-14
15:02:20 UTC (rev 16540)
+++ trunk/freenet/src/freenet/node/SeedClientPeerNode.java 2007-12-14
15:18:21 UTC (rev 16541)
@@ -71,4 +71,8 @@
node.peers.disconnect(this, false, false);
return ret;
}
+
+ protected boolean generateIdentityFromPubkey() {
+ return true;
+ }
}
Modified: trunk/freenet/src/freenet/node/SeedServerPeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/SeedServerPeerNode.java 2007-12-14
15:02:20 UTC (rev 16540)
+++ trunk/freenet/src/freenet/node/SeedServerPeerNode.java 2007-12-14
15:18:21 UTC (rev 16541)
@@ -90,4 +90,8 @@
node.peers.disconnect(this, false, false);
return ret;
}
+
+ protected boolean generateIdentityFromPubkey() {
+ return false;
+ }
}