On Friday 21 September 2007 13:25, you wrote:
> * Matthew Toseland <toad at amphibian.dyndns.org> [2007-09-21 13:12:56]:
>
> > What is the motive for having a new and wacky means of sending DSAGroup's?
We
> > already have methods to serialise them to/from byte[] ...
> >
> > Anyway, we don't need to send the group in the darknet-darknet case.
>
> Yeah, but do we want to send "nothing" insteed ? there might be some
> hashes/signatures weaknesses if we "just don't send it"
AFAICS, we can quite happily leave out whatever we want from being sent.
However we mustn't tamper with anything inside an S_blah( ... ) or H
( ... ) : the hashes and signatures must be exactly as the standard
specifies, we can however save a few bytes by not sending unnecessary
plaintext.
>
> >
> > On Monday 10 September 2007 13:05, you wrote:
> > > Author: nextgens
> > > Date: 2007-09-10 12:05:40 +0000 (Mon, 10 Sep 2007)
> > > New Revision: 15115
> > >
> > > Modified:
> > > branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
> > > Log:
> > > Send AuthMessage1, fix numerous bugs... add logging strings
> > > They are still problems with the parsing of DSAgroups/signatures
> > >
> > > Modified: branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
> > > ===================================================================
> > > --- branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
2007-09-10
> > 10:02:23 UTC (rev 15114)
> > > +++ branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
2007-09-10
> > 12:05:40 UTC (rev 15115)
> > > @@ -36,6 +36,7 @@
> > > import freenet.io.comm.PacketSocketHandler;
> > > import freenet.io.comm.Peer;
> > > import freenet.io.comm.PeerContext;
> > > +import freenet.support.BitArray;
> > > import freenet.support.HexUtil;
> > > import freenet.support.Logger;
> > > import freenet.support.StringArray;
> > > @@ -45,6 +46,7 @@
> > > import java.io.IOException;
> > > import java.io.ObjectOutputStream;
> > > import java.io.UnsupportedEncodingException;
> > > +import java.math.BigInteger;
> > > import java.util.Map;
> > > import java.util.HashMap;
> > >
> > > @@ -401,7 +403,7 @@
> > > * session key will be different,can be used to
> > > differentiate
between
> > > * parallel sessions
> > > */
> > > - ProcessMessage1(payload,pn,replyTo,0);
> > > + ProcessMessage1(payload,pn,replyTo);
> > >
> > > }
> > > else if(packetType==1){
> > > @@ -410,7 +412,7 @@
> > > * nonce and an authenticator calculated from a
> > > transient hash key
> > private
> > > * to the responder.
> > > */
> > > - ProcessMessage2(payload,pn,replyTo,1);
> > > + ProcessMessage2(payload,pn,replyTo);
> > > }
> > > else if(packetType==2){
> > > /*
> > > @@ -418,7 +420,7 @@
> > > * cached by the Responder.Receiving a
> > > duplicate message simply
causes
> > > * the responder to Re-transmit the
> > > corresponding message4
> > > */
> > > - ProcessMessage3(payload, pn, replyTo, 2);
> > > + ProcessMessage3(payload, pn, replyTo);
> > > }
> > > else if(packetType==3){
> > > /*
> > > @@ -426,7 +428,7 @@
> > > * using the same keys as in the previous
> > > message.
> > > * The signature is non-message recovering
> > > */
> > > - ProcessMessage4(payload,pn,replyTo,3);
> > > + ProcessMessage4(payload,pn,replyTo);
> > > }
> > > }
> > > else {
> > > @@ -434,35 +436,8 @@
> > > return;
> > > }
> > > }
> > > - /*
> > > - * Initiator DH Exponential
> > > - */
> > > - private synchronized byte[] Gi(PeerNode pn){
> > > - DiffieHellmanContext
> > dh=(DiffieHellmanContext)pn.getKeyAgreementSchemeContext();
> > > - if(dh==null)
> > > - {
> > > - if(shouldLogErrorInHandshake())
> > > - Logger.error(this,"Failed getting
> > > exponentials");
> > >
> > > - }
> > > - return dh.getOurExponential().toByteArray();
> > > - }
> > > -
> > > /*
> > > - * Responder DH Exponential
> > > - */
> > > - private synchronized byte[] Gr(PeerNode pn){
> > > - DiffieHellmanContext
> > dh=(DiffieHellmanContext)pn.getKeyAgreementSchemeContext();
> > > - if(dh==null)
> > > - {
> > > - if(shouldLogErrorInHandshake())
> > > - Logger.error(this,"Failed getting
> > > exponentials");
> > > -
> > > - }
> > > - return dh.getHisExponential().toByteArray();
> > > - }
> > > -
> > > - /*
> > > * Shared Secret key
> > > * Alice generates random number x and computes exponential g^x
> > > * Bob generates random number y and computes exponential g^y
> > > @@ -478,21 +453,8 @@
> > > }
> > > return dh.getKey();
> > > }
> > > +
> > > /*
> > > - * The Initiator and Responder nonce are random bytes used to provide
key
> > independence
> > > - */
> > > - private synchronized byte[] iNonce(){
> > > -
> > > - byte[] n=new byte[16];
> > > - node.random.nextBytes(n);
> > > - return n;
> > > - }
> > > - private synchronized byte[] rNonce(){
> > > - byte[] n=new byte[16];
> > > - node.random.nextBytes(n);
> > > - return n;
> > > - }
> > > - /*
> > > * Initiator Method:Message1
> > > * Process Message1
> > > * Send the Initiator nonce and DiffieHellman Exponential
> > > @@ -505,27 +467,29 @@
> > > * g^i
> > > * IDr'
> > > */
> > > - private void ProcessMessage1(byte[] payload,PeerNode pn,Peer
replyTo,int
> > phase)
> > > + private void ProcessMessage1(byte[] payload,PeerNode pn,Peer replyTo)
> > > {
> > > long t1=System.currentTimeMillis();
> > > if(logMINOR) Logger.minor(this, "Got a JFK(1) message,
> > > processing
it");
> > > // FIXME: follow the spec and send IDr' ?
> > > - if(payload.length < NONCE_SIZE +
DiffieHellman.modulusLengthInBytes()) {
> > > - Logger.error(this, "Packet too short from "+pn+":
> > > "+payload.length+"
> > after decryption in JFK("+phase+"), should be "+(NONCE_SIZE +
> > DiffieHellman.modulusLengthInBytes()));
> > > + if(payload.length < NONCE_SIZE +
> > > DiffieHellman.modulusLengthInBytes()
+
> > 3) {
> > > + Logger.error(this, "Packet too short from "+pn+":
> > > "+payload.length+"
> > after decryption in JFK(1), should be "+(NONCE_SIZE +
> > DiffieHellman.modulusLengthInBytes()));
> > > return;
> > > }
> > > + int offset=3;
> > > // get Ni
> > > byte[] nonceInitiator = new byte[NONCE_SIZE];
> > > - System.arraycopy(payload, 0, nonceInitiator, 0, NONCE_SIZE);
> > > + System.arraycopy(payload, offset, nonceInitiator, 0,
> > > NONCE_SIZE);
> > > + offset += NONCE_SIZE;
> > >
> > > // get g^i
> > > byte[] hisExponential = new
byte[DiffieHellman.modulusLengthInBytes()];
> > > - System.arraycopy(payload, NONCE_SIZE, hisExponential, 0,
> > DiffieHellman.modulusLengthInBytes());
> > > -
> > > - NativeBigInteger _hisExponential = new NativeBigInteger(1,
> > hisExponential);
> > > - if(_hisExponential.compareTo(NativeBigInteger.ONE) > 0)
> > > - sendMessage2(nonceInitiator, hisExponential, pn,
> > > replyTo);
> > > - else
> > > + System.arraycopy(payload, offset, hisExponential, 0,
> > DiffieHellman.modulusLengthInBytes());
> > > + NativeBigInteger _hisExponential = new
NativeBigInteger(hisExponential);
> > > + if(logMINOR) Logger.minor(this, "his exponential from message1
> > length="+DiffieHellman.modulusLengthInBytes() +" value=" +
> > _hisExponential.toHexString());
> > > + if(_hisExponential.compareTo(NativeBigInteger.ONE) > 0) {
> > > + sendMessage2(nonceInitiator, pn, replyTo);
> > > + }else
> > > Logger.error(this, "We can't accept the exponential
> > > "+pn+" sent us;
it's
> > smaller than 1!!");
> > >
> > > long t2=System.currentTimeMillis();
> > > @@ -534,19 +498,46 @@
> > > }
> > >
> > > /*
> > > - * format:
> > > - * Ni,Nr,g^r,GrpInfo(r),IDr
> > > - * Signature[g^r,grpInfo(r)]
> > > - * Hashed JFKAuthenticator
> > > - * FIXME: IDr' not sent during JFK(1) ?
> > > - */
> > > - private void sendMessage2(byte[] nonceInitator, byte[] hisExponential,
> > PeerNode pn, Peer replyTo) {
> > > + * format:
> > > + * Ni,g^i,IDr'
> > > + * FIXME: IDr' not sent?
> > > + */
> > > + private void sendMessage1(PeerNode pn, Peer replyTo) {
> > > + if(logMINOR) Logger.minor(this, "Sending a JFK(1) message to
> > > "+pn);
> > > + DiffieHellmanLightContext dhContext =
> > > getLightDiffieHellmanContext();
> > > + int offset = 0;
> > > + byte[] idR = new byte[0];
> > > + byte[] myExponential =
> > stripBigIntegerToNetworkFormat(dhContext.myExponential);
> > > + byte[] myNonce = new byte[NONCE_SIZE];
> > > + node.random.nextBytes(myNonce);
> > > +
> > > + byte[] message1 = new
> > byte[NONCE_SIZE+DiffieHellman.modulusLengthInBytes()+idR.length];
> > > +
> > > + System.arraycopy(myNonce, 0, message1, offset, NONCE_SIZE);
> > > + offset += NONCE_SIZE;
> > > + if(logMINOR) Logger.minor(this, "My Exponential (message1),
> > > length
> > ="+DiffieHellman.modulusLengthInBytes()+" value ="+
> > dhContext.myExponential.toHexString());
> > > + System.arraycopy(myExponential, 0, message1, offset,
> > DiffieHellman.modulusLengthInBytes());
> > > + offset += DiffieHellman.modulusLengthInBytes();
> > > + System.arraycopy(idR, 0, message1, offset, idR.length);
> > > + offset += idR.length;
> > > +
> > > + sendAuthPacket(1,2,0,message1,pn,replyTo);
> > > + }
> > > +
> > > + /*
> > > + * format:
> > > + * Ni,Nr,g^r,GrpInfo(r),IDr
> > > + * Signature[g^r,grpInfo(r)]
> > > + * Hashed JFKAuthenticator
> > > + * FIXME: IDr' not sent during JFK(1) ?
> > > + */
> > > + private void sendMessage2(byte[] nonceInitator, PeerNode pn, Peer
replyTo)
> > {
> > > if(logMINOR) Logger.minor(this, "Sending a JFK(2) message to
> > > "+pn);
> > > DiffieHellmanLightContext dhContext =
> > > getLightDiffieHellmanContext();
> > > byte[] idR = new byte[0];
> > > byte[] myDHGroup = dhContext.group.asBytes();
> > > byte[] myNonce = new byte[NONCE_SIZE];
> > > - byte[] myExponential = dhContext.myExponential.toByteArray();
> > > + byte[] myExponential =
> > stripBigIntegerToNetworkFormat(dhContext.myExponential);
> > > node.random.nextBytes(myNonce);
> > > byte[] signature;
> > > try {
> > > @@ -566,8 +557,8 @@
> > > offset += NONCE_SIZE;
> > > System.arraycopy(myNonce, 0, message2, offset, NONCE_SIZE);
> > > offset += NONCE_SIZE;
> > > - System.arraycopy(myExponential, 0, message2, offset,
> > myExponential.length);
> > > - offset += myExponential.length;
> > > + System.arraycopy(myExponential, 0, message2, offset,
> > DiffieHellman.modulusLengthInBytes());
> > > + offset += DiffieHellman.modulusLengthInBytes();
> > > // TODO: are groups modulo something ?
> > > message2[offset++] =
> > > Integer.valueOf(myDHGroup.length).byteValue();
> > > System.arraycopy(myDHGroup, 0, message2, offset,
> > > myDHGroup.length);
> > > @@ -580,7 +571,7 @@
> > >
> > > System.arraycopy(authenticator, 0, message2, offset,
> > > HASH_LENGTH);
> > >
> > > - sendAuthPacket(1,2,2,message2,pn,replyTo);
> > > + sendAuthPacket(1,2,1,message2,pn,replyTo);
> > > }
> > >
> > > /*
> > > @@ -614,7 +605,9 @@
> > > * Hash the authenticator using SHA256
> > > */
> > > private byte[] computeHashedJFKAuthenticator(byte[] gR, byte[] nR,
byte[]
> > nI, byte[] address) {
> > > - return SHA256.digest(computeJFKAuthenticator(gR, nR, nI,
> > > address));
> > > + byte[] result = SHA256.digest(computeJFKAuthenticator(gR, nR,
> > > nI,
> > address));
> > > + assert(result.length == HASH_LENGTH);
> > > + return result;
> > > }
> > >
> > > /*
> > > @@ -634,18 +627,17 @@
> > > * @param The peerNode we are talking to
> > > */
> > >
> > > - private void ProcessMessage2(byte[] payload,PeerNode pn,Peer
replyTo,int
> > phase)
> > > + private void ProcessMessage2(byte[] payload,PeerNode pn,Peer replyTo)
> > > {
> > > long t1=System.currentTimeMillis();
> > > if(logMINOR) Logger.minor(this, "Got a JFK(2) message,
> > > processing
it");
> > > // FIXME: follow the spec and send IDr' ?
> > > - // FIXME: Are we checking for the right condition here?
> > > - if(payload.length < NONCE_SIZE +
DiffieHellman.modulusLengthInBytes()) {
> > > - Logger.error(this, "Packet too short from "+pn+":
> > > "+payload.length+"
> > after decryption in JFK("+phase+"), should be "+(NONCE_SIZE +
> > DiffieHellman.modulusLengthInBytes()));
> > > + if(payload.length < NONCE_SIZE +
> > > DiffieHellman.modulusLengthInBytes()
+
> > 3) {
> > > + Logger.error(this, "Packet too short from "+pn+":
> > > "+payload.length+"
> > after decryption in JFK(2), should be "+(NONCE_SIZE +
> > DiffieHellman.modulusLengthInBytes()));
> > > return;
> > > }
> > >
> > > - int inputOffset=0;
> > > + int inputOffset=3;
> > > byte[] nonceInitiator = new byte[NONCE_SIZE];
> > > System.arraycopy(payload, inputOffset, nonceInitiator, 0,
NONCE_SIZE);
> > > inputOffset += NONCE_SIZE;
> > > @@ -656,7 +648,7 @@
> > > byte[] hisExponential = new
byte[DiffieHellman.modulusLengthInBytes()];
> > > System.arraycopy(payload, inputOffset, hisExponential, 0,
> > DiffieHellman.modulusLengthInBytes());
> > > inputOffset += DiffieHellman.modulusLengthInBytes();
> > > - NativeBigInteger _hisExponential = new NativeBigInteger(1,
> > hisExponential);
> > > + NativeBigInteger _hisExponential = new
NativeBigInteger(hisExponential);
> > > if(_hisExponential.compareTo(NativeBigInteger.ONE) < 1) {
> > > Logger.error(this, "We can't accept the exponential
> > > "+pn+" sent us;
it's
> > smaller than 1!!");
> > > return;
> > > @@ -682,8 +674,13 @@
> > > byte[] locallyExpectedExponentials = new
> > byte[hisExponential.length+hisGroupLength];
> > > System.arraycopy(hisExponential, 0,
> > > locallyExpectedExponentials, 0,
> > hisExponential.length);
> > > System.arraycopy(hisGroup, 0, locallyExpectedExponentials,
> > hisExponential.length, hisGroupLength);
> > > - DSASignature signatureToCheck = new DSASignature(new
> > String(remoteSignedExponentials));
> > > - if(!DSA.verify(pn.peerPubKey, signatureToCheck, new
> > NativeBigInteger(1,locallyExpectedExponentials), false)) {
> > > + String sigToCheckAsString = null;
> > > + try {
> > > + sigToCheckAsString = new
> > > String(remoteSignedExponentials, "UTF-8");
> > > + } catch (UnsupportedEncodingException e) {}
> > > + if(logMINOR) Logger.minor(this, "His signedExponentials :"+
> > HexUtil.bytesToHex(hisExponential));
> > > + DSASignature signatureToCheck = new
> > > DSASignature(sigToCheckAsString);
> > > + if(!DSA.verify(pn.peerPubKey, signatureToCheck, new
> > NativeBigInteger(locallyExpectedExponentials), false)) {
> > > Logger.error(this, "The signature verification has
> > > failed!!");
> > > return;
> > > }
> > > @@ -712,7 +709,7 @@
> > > * @param The peerNode we are talking to
> > > * @return byte Message3
> > > */
> > > - private void ProcessMessage3(byte[] payload, PeerNode pn,Peer
replyTo,int
> > phase)
> > > + private void ProcessMessage3(byte[] payload, PeerNode pn,Peer replyTo)
> > >
> > > {
> > > long t1 = System.currentTimeMillis();
> > > if(logMINOR) Logger.minor(this, "Got a JFK(3) message,
> > processing it");
> > > @@ -780,7 +777,7 @@
> > > * @param The peerNode we are talking to
> > > */
> > >
> > > - private void ProcessMessage4(byte[] payload,PeerNode pn,Peer
replyTo,int
> > phase)
> > > + private void ProcessMessage4(byte[] payload,PeerNode pn,Peer replyTo)
> > > {
> > > if(logMINOR) Logger.minor(this, "Got a JFK(4) message,
> > > processing
it");
> > > long t1=System.currentTimeMillis();
> > > @@ -934,7 +931,7 @@
> > > // We don't want to keep the lock while sending
> > > try
> > > {
> > > -
> >
sendAuthPacket(1,2,3,getBytes(message4Cache.get(hashedAuthenticator)),pn,replyTo);
> > > +
> >
sendAuthPacket(1,2,2,getBytes(message4Cache.get(hashedAuthenticator)),pn,replyTo);
> > > }
> > > catch(IOException e){
> > > Logger.error(this,"Error getting
> > > bytes");
> > > @@ -1062,20 +1059,7 @@
> > > private void sendFirstHalfDHPacket(int phase, int negType,
> > NativeBigInteger integer, PeerNode pn, Peer replyTo) {
> > > long time1 = System.currentTimeMillis();
> > > if(logMINOR) Logger.minor(this, "Sending
> > ("+phase+") "+integer.toHexString()+" to "+pn.getPeer());
> > > - byte[] data = integer.toByteArray();
> > > - int targetLength = DiffieHellman.modulusLengthInBytes();
> > > - if(data.length != targetLength) {
> > > - byte[] newData = new byte[targetLength];
> > > - if((data.length == targetLength+1) && (data[0] == 0)) {
> > > - // Sign bit
> > > - System.arraycopy(data, 1, newData, 0,
> > > targetLength);
> > > - } else if(data.length < targetLength) {
> > > - System.arraycopy(data, 0, newData,
> > > targetLength-data.length,
> > data.length);
> > > - } else {
> > > - throw new IllegalStateException("Too long!");
> > > - }
> > > - data = newData;
> > > - }
> > > + byte[] data = stripBigIntegerToNetworkFormat(integer);
> > > if(logMINOR)
Logger.minor(this, "Processed: "+HexUtil.bytesToHex(data));
> > > long time2 = System.currentTimeMillis();
> > > if((time2 - time1) > 200) {
> > > @@ -2151,7 +2135,7 @@
> > > return;
> > > }
> > > if(logMINOR) Logger.minor(this, "Possibly sending handshake to
> > > "+pn+"
> > negotiation type "+negType);
> > > - DiffieHellmanContext ctx;
> > > + DiffieHellmanContext ctx = null;
> > > Peer[] handshakeIPs;
> > > if(!pn.shouldSendHandshake()) {
> > > if(logMINOR) Logger.minor(this, "Not sending handshake
> > to "+pn.getPeer()+" because pn.shouldSendHandshake() returned false");
> > > @@ -2168,7 +2152,7 @@
> > > if((thirdTime - secondTime) > 1000)
> > > Logger.error(this, "couldNotSendHandshake()
> > > (after
getHandshakeIPs())
> > took more than a second to execute ("+(thirdTime - secondTime)+") working
> > on "+pn.userToString());
> > > return;
> > > - } else {
> > > + } else if(negType < 2){
> > > long DHTime1 = System.currentTimeMillis();
> > > ctx = DiffieHellman.generateContext();
> > > long DHTime2 = System.currentTimeMillis();
> > > @@ -2196,7 +2180,10 @@
> > > if(logMINOR) Logger.minor(this, "Not sending
> > > handshake
> > to "+handshakeIPs[i]+" for "+pn.getPeer()+" because it's not a real
Internet
> > address and metadata.allowLocalAddresses is not true");
> > > continue;
> > > }
> > > - sendFirstHalfDHPacket(0, negType,
> > > ctx.getOurExponential(), pn,
peer);
> > > + if(negType == 1)
> > > + sendFirstHalfDHPacket(0, negType,
> > > ctx.getOurExponential(), pn,
peer);
> > > + else
> > > + sendMessage1(pn, peer);
> > > pn.sentHandshake();
> > > sentCount += 1;
> > > }
> > > @@ -2274,4 +2261,23 @@
> > > authenticatorCache.clear();
> > > }
> > > }
> > > +
> > > + private byte[] stripBigIntegerToNetworkFormat(BigInteger exponential)
{
> > > + byte[] data = exponential.toByteArray();
> > > + int targetLength = DiffieHellman.modulusLengthInBytes();
> > > +
> > > + if(data.length != targetLength) {
> > > + byte[] newData = new byte[targetLength];
> > > + if((data.length == targetLength+1) && (data[0] == 0)) {
> > > + // Sign bit
> > > + System.arraycopy(data, 1, newData, 0,
> > > targetLength);
> > > + } else if(data.length < targetLength) {
> > > + System.arraycopy(data, 0, newData,
> > > targetLength-data.length,
> > data.length);
> > > + } else {
> > > + throw new IllegalStateException("Too long!");
> > > + }
> > > + data = newData;
> > > + }
> > > + return data;
> > > + }
> > > }
> > > \ No newline at end of file
> > >
> > > _______________________________________________
> > > cvs mailing list
> > > cvs at freenetproject.org
> > > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> > >
> > >
>
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL:
<https://emu.freenetproject.org/pipermail/devl/attachments/20070921/be5b2762/attachment.pgp>