Author: kryptos
Date: 2007-09-22 10:33:59 +0000 (Sat, 22 Sep 2007)
New Revision: 15252
Modified:
branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
Log:
Updates to JFK: Fixed JFK(4)
Modified: branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
===================================================================
--- branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java 2007-09-21
23:24:55 UTC (rev 15251)
+++ branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java 2007-09-22
10:33:59 UTC (rev 15252)
@@ -11,17 +11,13 @@
import net.i2p.util.NativeBigInteger;
import freenet.crypt.BlockCipher;
import freenet.crypt.DSA;
-import freenet.crypt.DSAGroup;
-import freenet.crypt.DSAPrivateKey;
import freenet.crypt.DSASignature;
import freenet.crypt.DiffieHellman;
import freenet.crypt.DiffieHellmanContext;
import freenet.crypt.DiffieHellmanLightContext;
import freenet.crypt.EntropySource;
-import freenet.crypt.Global;
import freenet.crypt.HMAC;
import freenet.crypt.PCFBMode;
-import freenet.crypt.RandomSource;
import freenet.crypt.SHA256;
import freenet.crypt.crypto_Random.eKey;
import freenet.io.comm.AsyncMessageCallback;
@@ -43,10 +39,10 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
-import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
-import java.util.Map;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
/**
* @author amphibian
@@ -75,6 +71,7 @@
*/
private final HashMap authenticatorCache;
+ private final List buffer;
final eKey encryptionKey;
/** We renew it on each *successful* run of the protocol (the spec.
says "once a while") - access is synchronized! */
@@ -120,6 +117,7 @@
fnpTimingSource = new EntropySource();
myPacketDataSource = new EntropySource();
authenticatorCache = new HashMap();
+ buffer = new ArrayList();
encryptionKey = new eKey();
fullHeadersLengthMinimum = HEADERS_LENGTH_MINIMUM +
sock.getHeadersLength();
@@ -804,7 +802,7 @@
DiffieHellmanLightContext dhContext =
getLightDiffieHellmanContext();
byte[] ourExponential = dhContext.myExponential.toByteArray();
byte[] unVerifiedData=new
byte[NONCE_SIZE*2+DiffieHellman.modulusLengthInBytes()*2];
- int offset = 0;
+ int offset =
0;http://www.google.co.in/search?q=inline+gpg&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:official&client=firefox-a
// Ni
System.arraycopy(nonceInitiator, 0, unVerifiedData, offset,
NONCE_SIZE);
offset += NONCE_SIZE;
@@ -845,6 +843,14 @@
byte[] iv=new byte[pk.lengthIV()];
node.random.nextBytes(iv);
byte[] idI = new byte[0];
+ // Buffer of Ni,Nr,g^i,g^r,IDi
+ byte[] buf = new byte[unVerifiedData.length+idI.length];
+ System.arraycopy(unVerifiedData,0,buf,0,unVerifiedData.length);
+ System.arraycopy(idI,0,buf,unVerifiedData.length,idI.length);
+ // Store buf in a List for use in JFK(4)
+ synchronized(buffer){
+ buffer.add(buf);
+ }
int encryptedDataLength = iv.length + idI.length + r.length +
s.length + 2;
byte[] encryptedData = new byte[encryptedDataLength];
System.arraycopy(iv, 0, encryptedData, 0, iv.length);
@@ -894,9 +900,31 @@
inputOffset += ivLength;
// Now verify signature
// FIXME: How do we verify the signature?
+ byte[] r = new byte[Node.SIGNATURE_PARAMETER_LENGTH];
+ System.arraycopy(payload, inputOffset, r, 0,
Node.SIGNATURE_PARAMETER_LENGTH);
+ inputOffset += Node.SIGNATURE_PARAMETER_LENGTH;
+ byte[] s = new byte[Node.SIGNATURE_PARAMETER_LENGTH];
+ System.arraycopy(payload, inputOffset, s, 0,
Node.SIGNATURE_PARAMETER_LENGTH);
+ inputOffset += Node.SIGNATURE_PARAMETER_LENGTH;
+ DSASignature remoteSignature = new DSASignature(new
NativeBigInteger(1,r), new NativeBigInteger(1,s));
+ if(logMINOR)
+ Logger.minor(this, "Remote sent us the following sig
:"+remoteSignature.toLongString());
+ // Since we need the params only for signature verification, we
can immediately remove them from the List
+ // Thus, at any point of time, the list will only contain only
one entry
+ byte[] locallyExpectedExponentials = new
byte[Node.SIGNATURE_PARAMETER_LENGTH*2];
+ synchronized(buffer){
+ try{
+ locallyExpectedExponentials =
SHA256.digest(getBytes(buffer.get(0)));
+ }catch(IOException e){
+ Logger.error(this,"Error getting signData in bytes");
+ }
+ }
+ buffer.remove(0);
+ if(!DSA.verify(pn.peerPubKey, remoteSignature, new
NativeBigInteger(1, locallyExpectedExponentials), false)) {
+ Logger.error(this, "The signature verification has
failed!!");
+ return;
+ }
- // FIXME: cache JFK(4)?
-
// FIXME: JFK handshake completion?
}
/*
@@ -2227,6 +2255,7 @@
return SHA256.digest(toSign);
}
+
/*
* Actually sign the DH parameters for message2
*/