Author: kryptos
Date: 2007-08-30 18:09:45 +0000 (Thu, 30 Aug 2007)
New Revision: 14926
Modified:
branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
Log:
Cached authenticator
Modified: branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
===================================================================
--- branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java 2007-08-30
14:57:43 UTC (rev 14925)
+++ branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java 2007-08-30
18:09:45 UTC (rev 14926)
@@ -41,8 +41,10 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
+import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
+import java.util.List;
/**
* @author amphibian
@@ -64,6 +66,7 @@
final EntropySource myPacketDataSource;
final Map message3Cache;
final Map message4Cache;
+ final List authenticatorCache;
final eKey encryptionKey;
final DSAGroup g;
final RandomSource r;
@@ -92,7 +95,7 @@
final int fullHeadersLengthMinimum;
final int fullHeadersLengthOneMessage;
- private static byte[] AUTHENTICATOR;
+
public FNPPacketMangler(Node node, NodeCrypto crypt, PacketSocketHandler
sock) {
this.node = node;
@@ -103,6 +106,7 @@
myPacketDataSource = new EntropySource();
message3Cache = new HashMap();
message4Cache = new HashMap();
+ authenticatorCache = new ArrayList();
encryptionKey = new eKey();
g = Global.DSAgroupBigA;
r=node.random;
@@ -538,12 +542,13 @@
HKrGenerator trKey=new HKrGenerator(node);
byte[] hkr=trKey.getNewHKr();
HMAC hash=new HMAC(SHA1.getInstance());
- AUTHENTICATOR=hash.mac(hkr,processMessageAuth(pn),hkr.length);
- byte[] Message2=new
byte[AUTHENTICATOR.length+unVerifiedData.length+s.length+r.length+1];
+ byte[] authenticator =
hash.mac(hkr,processMessageAuth(pn),hkr.length);
+ authenticatorCache.add(authenticator);
+ byte[] Message2=new
byte[authenticator.length+unVerifiedData.length+s.length+r.length+1];
byte[] signedData=new byte[s.length+r.length];
System.arraycopy(signedData,0,Message2,0,signedData.length);
System.arraycopy(unVerifiedData,0,Message2,signData.length+1,unVerifiedData.length);
-
System.arraycopy(AUTHENTICATOR,0,Message2,signedData.length+unVerifiedData.length+1,AUTHENTICATOR.length);
+
System.arraycopy(authenticator,0,Message2,signedData.length+unVerifiedData.length+1,authenticator.length);
//Send params:Version,negType,phase,data,peernode,peer
sendMessage1or2Packet(1,2,1,Message2,pn,replyTo);
long t2=System.currentTimeMillis();
@@ -567,6 +572,15 @@
private byte[] ProcessMessage3(PeerNode pn,Peer replyTo,int phase)
{
+ // Get the authenticator,which is the latest entry into the cache
+ // It is basically a keyed hash(HMAC); size of output is that of the
underlying hash function
+ byte[] authenticator = new byte[16];
+ try{
+ authenticator =
getBytes(authenticatorCache.get(authenticatorCache.size()));
+ }
+ catch(IOException e){
+ Logger.error(this,"Error getting bytes");
+ }
byte[] unVerifiedData=new
byte[iNonce().length+rNonce().length+Gr(pn).length+Gi(pn).length+1];
System.arraycopy(iNonce(),0,unVerifiedData,0,iNonce().length);
System.arraycopy(rNonce(),0,unVerifiedData,iNonce().length+1,rNonce().length);
@@ -604,10 +618,10 @@
System.arraycopy(s, 0, encryptedData, count, s.length);
count += s.length;
pk.blockEncipher(encryptedData, 0, encryptedData.length);
- byte[] message3=new
byte[encryptedData.length+AUTHENTICATOR.length+unVerifiedData.length+1];
+ byte[] message3=new
byte[encryptedData.length+authenticator.length+unVerifiedData.length+1];
System.arraycopy(encryptedData,0,message3,0,encryptedData.length);
-
System.arraycopy(AUTHENTICATOR,0,message3,encryptedData.length+1,AUTHENTICATOR.length);
-
System.arraycopy(unVerifiedData,0,message3,encryptedData.length+AUTHENTICATOR.length+1,unVerifiedData.length);
+
System.arraycopy(authenticator,0,message3,encryptedData.length+1,authenticator.length);
+
System.arraycopy(unVerifiedData,0,message3,encryptedData.length+authenticator.length+1,unVerifiedData.length);
return message3;
}