Author: nextgens
Date: 2006-09-06 13:24:08 +0000 (Wed, 06 Sep 2006)
New Revision: 10405
Modified:
trunk/freenet/src/freenet/node/FNPPacketMangler.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/PeerNode.java
Log:
We need to specify the encoding : UTF-8 when using getBytes()
Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java 2006-09-06
12:11:41 UTC (rev 10404)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java 2006-09-06
13:24:08 UTC (rev 10405)
@@ -11,6 +11,7 @@
import freenet.crypt.DiffieHellmanContext;
import freenet.crypt.EntropySource;
import freenet.crypt.PCFBMode;
+import freenet.crypt.StationToStationContext;
import freenet.io.comm.*;
import freenet.io.comm.Peer.LocalAddressException;
import freenet.support.Fields;
@@ -280,7 +281,7 @@
}else if (negType == 1){
// We are gonna do simple StS
- if((packetType < 0) || (packetType > 3)) {
+ if((packetType < 0) || (packetType > 2)) {
Logger.error(this, "Decrypted auth packet but unknown
packet type "+packetType+" from "+replyTo+" possibly from "+pn);
return;
}
@@ -305,6 +306,19 @@
* This secret, K, can then be used to encrypt further
communication.
*/
+ if(packetType == 0) {
+ StationToStationContext ctx = new
StationToStationContext(node.getMyPrivKey(), pn.peerCryptoGroup, pn.peerPubKey,
node.random);
+ if(ctx == null) return;
+ // Send g^x%p
+ sendFirstStSPacket(1, ctx.getOurExponential(), pn,
replyTo);
+ } else if(packetType == 1) {
+ StationToStationContext ctx = new
StationToStationContext(node.getMyPrivKey(), pn.peerCryptoGroup, pn.peerPubKey,
node.random);
+ if(ctx == null) return;
+ sendSecondStSPacket(2, ctx, pn, replyTo, payload);
+ } else if(packetType == 2) {
+
+ }
+
// Not implemented yet... fail
return;
}
@@ -544,7 +558,7 @@
} else {
ctx = DiffieHellman.generateContext();
// Don't calculate the key until we need it
- pn.setDHContext(ctx);
+ pn.setKeyAgreementSchemeContext(ctx);
}
ctx.setOtherSideExponential(a);
if(logMINOR) Logger.minor(this, "His exponential: "+a.toHexString());
@@ -1446,7 +1460,7 @@
long DHTime2 = System.currentTimeMillis();
if((DHTime2 - DHTime1) > 1000)
Logger.error(this, "DHTime2 is more than a second after
DHTime1 ("+(DHTime2 - DHTime1)+") working on "+pn.getName());
- pn.setDHContext(ctx);
+ pn.setKeyAgreementSchemeContext(ctx);
long DHTime3 = System.currentTimeMillis();
if((DHTime3 - DHTime2) > 1000)
Logger.error(this, "DHTime3 is more than a second after
DHTime2 ("+(DHTime3 - DHTime2)+") working on "+pn.getName());
@@ -1488,4 +1502,24 @@
if(context == null) return false;
return !((PeerNode)context).isConnected();
}
+
+ /**
+ * Send a first-half (phase 0 or 1) StS negotiation packet to the node.
+ * @param phase The phase of the message to be sent (0 or 1).
+ * @param integer
+ * @param replyTo
+ */
+ private void sendFirstStSPacket(int phase, NativeBigInteger integer,
PeerNode pn, Peer replyTo) {
+ if(logMINOR) Logger.minor(this, "Sending ("+phase+")
"+integer.toHexString()+" to "+pn.getPeer());
+ byte[] data = integer.toByteArray();
+
+ sendAuthPacket(1, 1, phase, data, pn, replyTo);
+ }
+
+ private void sendSecondStSPacket(int phase, StationToStationContext ctx,
PeerNode pn, Peer replyTo, byte[] data) {
+ NativeBigInteger hisExponent = new NativeBigInteger(data);
+ ctx.setOtherSideExponential(hisExponent);
+
+ sendAuthPacket(1, 1, phase, ctx.concatAndSignAndCrypt(), pn, replyTo);
+ }
}
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-09-06 12:11:41 UTC (rev
10404)
+++ trunk/freenet/src/freenet/node/Node.java 2006-09-06 13:24:08 UTC (rev
10405)
@@ -383,6 +383,7 @@
static final int EXIT_COULD_NOT_START_FCP = 17;
static final int EXIT_COULD_NOT_START_FPROXY = 18;
static final int EXIT_COULD_NOT_START_TMCI = 19;
+ static final int EXIT_CRAPPY_JVM = 255;
public static final int EXIT_DATABASE_REQUIRES_RESTART = 20;
public static final int EXIT_COULD_NOT_START_UPDATER = 21;
static final int EXIT_EXTRA_PEER_DATA_DIR = 22;
@@ -1660,7 +1661,15 @@
// TODO: maybe synchronize ?
if(myReferenceSignature == null || mySignedReference == null ||
!mySignedReference.equals(fs.toOrderedString())){
mySignedReference = fs.toOrderedString();
- myReferenceSignature = DSA.sign(myCryptoGroup,
myPrivKey, new BigInteger(mySignedReference.getBytes()), random);
+ try{
+ myReferenceSignature = DSA.sign(myCryptoGroup,
myPrivKey, new BigInteger(mySignedReference.getBytes("UTF-8")), random);
+ } catch(UnsupportedEncodingException e){
+ //duh ?
+ Logger.error(this, "Error while signing the
node identity!"+e);
+ System.err.println("Error while signing the
node identity!"+e);
+ e.printStackTrace();
+ exit(EXIT_CRAPPY_JVM);
+ }
}
fs.put("sig", myReferenceSignature.toString());
@@ -2992,4 +3001,12 @@
return totalPayloadSent;
}
}
+
+ protected DSAPrivateKey getMyPrivKey() {
+ return myPrivKey;
+ }
+
+ protected DSAPublicKey getMyPubKey() {
+ return myPubKey;
+ }
}
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-09-06 12:11:41 UTC
(rev 10404)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-09-06 13:24:08 UTC
(rev 10405)
@@ -33,7 +33,6 @@
import freenet.crypt.DSAGroup;
import freenet.crypt.DSAPublicKey;
import freenet.crypt.DSASignature;
-import freenet.crypt.DiffieHellmanContext;
import freenet.crypt.KeyAgreementSchemeContext;
import freenet.crypt.UnsupportedCipherException;
import freenet.crypt.ciphers.Rijndael;
@@ -409,12 +408,23 @@
String signature = fs.get("sig");
fs.removeValue("sig");
- if(signature == null || !DSA.verify(peerPubKey, new
DSASignature(signature), new BigInteger(fs.toOrderedString().getBytes()))){
- Logger.error(this, "The integrity of the reference has
been compromized!");
- this.isSignatureVerificationSuccessfull = false;
- if((Version.getArbitraryBuildNumber(version)>966) &&
(!fromLocal)) // TODO: REMOVE: the backward compat. kludge : version checking
- throw new
ReferenceSignatureVerificationException("The integrity of the reference has
been compromized!");
- }else
+ if(!fromLocal){
+ try{
+ if(signature == null || !DSA.verify(peerPubKey,
new DSASignature(signature), new
BigInteger(fs.toOrderedString().getBytes("UTF-8")))){
+ Logger.error(this, "The integrity of
the reference has been compromized!");
+ this.isSignatureVerificationSuccessfull
= false;
+
if(Version.getArbitraryBuildNumber(version)>966) // TODO: REMOVE: the backward
compat. kludge : version checking
+ throw new
ReferenceSignatureVerificationException("The integrity of the reference has
been compromized!");
+ }else
+ this.isSignatureVerificationSuccessfull
= true;
+ } 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();
+ node.exit(Node.EXIT_CRAPPY_JVM);
+ }
+ }else // Local is always good (assumed)
this.isSignatureVerificationSuccessfull = true;
} catch (IllegalBase64Exception e) {
Logger.error(this, "Caught "+e, e);
@@ -1322,9 +1332,9 @@
return ctx;
}
- public synchronized void setDHContext(DiffieHellmanContext ctx2) {
+ public synchronized void
setKeyAgreementSchemeContext(KeyAgreementSchemeContext ctx2) {
this.ctx = ctx2;
- if(logMINOR) Logger.minor(this, "setDHContext("+ctx2+") on "+this);
+ if(logMINOR) Logger.minor(this,
"setKeyAgreementSchemeContext("+ctx2+") on "+this);
}
/**