[freenet-cvs] r13658 - in branches/freenet-jfk: devnotes src/freenet/crypt src/freenet/crypt/crypto_Random src/freenet/node

kryptos at freenetproject.org kryptos at freenetproject.org
Wed Jun 20 17:52:51 UTC 2007


Author: kryptos
Date: 2007-06-20 17:52:51 +0000 (Wed, 20 Jun 2007)
New Revision: 13658

Added:
   branches/freenet-jfk/devnotes/crypto_Notes.txt
   branches/freenet-jfk/src/freenet/crypt/crypto_Random/
   branches/freenet-jfk/src/freenet/crypt/crypto_Random/session_Key.java
   branches/freenet-jfk/src/freenet/crypt/crypto_Random/sharedSecretKey1.java
   branches/freenet-jfk/src/freenet/crypt/crypto_Random/sharedSecretKey2.java
Modified:
   branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
Log:
Shared KeysJFK

Added: branches/freenet-jfk/devnotes/crypto_Notes.txt
===================================================================
--- branches/freenet-jfk/devnotes/crypto_Notes.txt	                        (rev 0)
+++ branches/freenet-jfk/devnotes/crypto_Notes.txt	2007-06-20 17:52:51 UTC (rev 13658)
@@ -0,0 +1,23 @@
+//////////////////////Just fast Keying//////////////////////////   
+
+   Message 1, I->R:  Ni, g^i
+
+   Message 2, R->I:  Ni, Nr, g^r, GRPINFOr, IDr,
+                     SIG{r}(g^r, GRPINFOr), HMAC{HKr}(Ni, Nr, g^i, g^r)
+
+   Message 3, I->R:  Ni, Nr, g^i, g^r, HMAC{HKr}(Ni, Nr, g^i, g^r),
+                     E{Ke}(IDi, sa, SIG{i}(Ni, Nr, g^i, g^r, IDr, sa))
+
+   Message 4, R->I:  E{Ke}(SIG{r}(Ni, Nr, g^i, g^r , IDi, sa, sa'), sa')
+
+
+   HKr: A transient hash key private to the Responder; this is a
+        global parameter for the Responder (i.e., it is not different
+        for every different protocol run), which changes periodically:
+        the Responder must pick a new g^r every time HKr changes.
+
+   Kir: A shared key derived from g^ir, Ni, and Nr, used as part of
+        the application SA 
+
+   Ke: A shared key derived from g^ir, Ni, and Nr, used to protect
+       messages 3 and 4 of the protocol.

Added: branches/freenet-jfk/src/freenet/crypt/crypto_Random/session_Key.java
===================================================================
--- branches/freenet-jfk/src/freenet/crypt/crypto_Random/session_Key.java	                        (rev 0)
+++ branches/freenet-jfk/src/freenet/crypt/crypto_Random/session_Key.java	2007-06-20 17:52:51 UTC (rev 13658)
@@ -0,0 +1,34 @@
+package freenet.crypt;
+import java.io.*;
+import java.util.*;
+import java.lang.*;
+public class session_Key
+{
+	/*
+	 * Constructor
+	 */
+	private session_Key{
+	}
+	/**
+          *Session key.
+          *The key is generated from Hash of Message:(Ni, Nr, 0) using the DF exponentials
+          *@param Ni: nonce from the initiator
+          *@param Nr: nonce from the responder
+          */
+        public static byte[] getSessionKey(byte[] DFExp,byte[] Ni, byte[] Nr)
+	{
+        	try
+		{
+            		byte[] byteArray=new byte[Ni.length + Nr.length + 1];
+            		System.arraycopy(Ni,0,byteArray,0,Ni.length);
+            		System.arraycopy(Nr,0,byteArray,Ni.length,Nr.length);
+            		byteArray[Ni.length + Nr.length]=Integer(0).byteValue();
+			HMAC s = new HMAC(SHA1.getInstance());
+			return s.mac(DFExp,byteArray,DFExp.length);
+        	}catch(Exception e){
+            		System.err.println("Exception:" + e);
+            		System.exit(1);
+            		return null;
+        	}
+    	}
+}

Added: branches/freenet-jfk/src/freenet/crypt/crypto_Random/sharedSecretKey1.java
===================================================================
--- branches/freenet-jfk/src/freenet/crypt/crypto_Random/sharedSecretKey1.java	                        (rev 0)
+++ branches/freenet-jfk/src/freenet/crypt/crypto_Random/sharedSecretKey1.java	2007-06-20 17:52:51 UTC (rev 13658)
@@ -0,0 +1,35 @@
+package freenet.crypt;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+public class sharedSecretKey1
+{
+        /*
+         * Constructor
+         */
+        private sharedSecretKey1{
+        }
+        /**
+          *Shared key.
+          *The key is generated from Hash of Message:(Ni, Nr, 1) using the DF exponentials
+          *@param Ni: nonce from the initiator
+          *@param Nr: nonce from the responder
+          */
+        public static byte[] getSharedKey1(byte[] DFExp,byte[] Ni, byte[] Nr)
+        {
+                try
+                {
+                        byte[] byteArray=new byte[Ni.length + Nr.length + 1];
+                        System.arraycopy(Ni,0,byteArray,0,Ni.length);
+                        System.arraycopy(Nr,0,byteArray,Ni.length,Nr.length);
+                        byteArray[Ni.length + Nr.length]=Integer(0).byteValue();
+                        HMAC s = new HMAC(SHA1.getInstance());
+                        return s.mac(DFExp,byteArray,DFExp.length);
+                }catch(Exception e){
+                        System.err.println("Exception:" + e);
+                        System.exit(1);
+                        return null;
+                }
+        }
+}
+

Added: branches/freenet-jfk/src/freenet/crypt/crypto_Random/sharedSecretKey2.java
===================================================================
--- branches/freenet-jfk/src/freenet/crypt/crypto_Random/sharedSecretKey2.java	                        (rev 0)
+++ branches/freenet-jfk/src/freenet/crypt/crypto_Random/sharedSecretKey2.java	2007-06-20 17:52:51 UTC (rev 13658)
@@ -0,0 +1,35 @@
+package freenet.crypt;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+public class sharedSecretKey2
+{
+        /*
+         * Constructor
+         */
+        private sharedSecretKey2{
+        }
+        /**
+          *Shared key.
+          *The key is generated from Hash of Message:(Ni, Nr, 2) using the DF exponentials
+          *@param Ni: nonce from the initiator
+          *@param Nr: nonce from the responder
+          */
+        public static byte[] getSharedKey2(byte[] DFExp,byte[] Ni, byte[] Nr)
+        {
+                try
+                {
+                        byte[] byteArray=new byte[Ni.length + Nr.length + 1];
+                        System.arraycopy(Ni,0,byteArray,0,Ni.length);
+                        System.arraycopy(Nr,0,byteArray,Ni.length,Nr.length);
+                        byteArray[Ni.length + Nr.length]=Integer(0).byteValue();
+                        HMAC s = new HMAC(SHA1.getInstance());
+                        return s.mac(DFExp,byteArray,DFExp.length);
+                }catch(Exception e){
+                        System.err.println("Exception:" + e);
+                        System.exit(1);
+                        return null;
+                }
+        }
+}
+

Modified: branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
===================================================================
--- branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java	2007-06-19 23:05:21 UTC (rev 13657)
+++ branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java	2007-06-20 17:52:51 UTC (rev 13658)
@@ -249,10 +249,10 @@
             return;
         }
 
-        if((negType < 0) || (negType > 1)) {
+        if((negType == 0)) {
             Logger.error(this, "Decrypted auth packet but unknown negotiation type "+negType+" from "+replyTo+" possibly from "+pn);
             return;
-        }else if (negType == 0 || negType == 1){
+        }else if ( negType == 1){
         	// Four stage Diffie-Hellman. 0 = ephemeral, 1 = payload stages are signed (not quite STS)
         	// FIXME reduce to 3 stages and implement STS properly (we have a separate validation mechanism in PeerNode)
         	// AFAICS this (with negType=1) is equivalent in security to STS; it expands the second phase into a second and a fourth phase.
@@ -310,6 +310,38 @@
         		processSignedDHTwoOrThree(3, payload, pn, replyTo, false);
         	}
         }
+	else if (negType==2){
+		/*
+		 * We implement Just Fast Keying key management protocol with active identity     		  * protection for the initiator and no identity protection for the responder
+		 * Refer devNotes for detailed explanation of the protocol
+		 */ 
+		if(packetType<0 || packetType>3){
+			Logger.error(this,"Unknown PacketType" + packetType + "from" + replyTo + "from" +pn); 
+			return ;
+	}
+		else if(packetType==0){
+		      /*
+		       * Initiator- This is a straightforward DiffieHellman exponential. The Init                       * iator Nonce serves two purposes;it allows the initiator to use the same 			 * exponentials during different sessions while ensuring that the resulting 			  * session key will be different,can be used to differentiate between
+		       * parallel sessions
+		       */
+		}
+		else if(packetType==1){
+		      /*
+		       * Responder replies with a signed copy of his own exponential, a random
+		       * nonce and an authenticator calculated from a transient hash key private
+		       * to the responder
+		       */
+		}
+		else if(packetType==2){
+		      // Initiator echoes the data sent by the responder
+		       
+		}
+		else if(packetType==3){
+		      /*
+		       * Encrypted message of the signature on both nonces, both exponentials 
+		       * using the same keys as in the previous message
+		       */
+		}
     }
 
     /**
@@ -337,6 +369,20 @@
         byte[] hisExp = ctx.getHisExponential().toByteArray();
         
         MessageDigest md = SHA256.getMessageDigest();
+     
+    private void sendSignedDHCompletion(int phase, BlockCipher cipher, PeerNode pn, Peer replyTo, DiffieHellmanContext ctx) {
+        PCFBMode pcfb = PCFBMode.create(cipher);
+        byte[] iv = new byte[pcfb.lengthIV()];
+        
+        byte[] myRef = node.myCompressedSetupRef();
+        byte[] data = new byte[myRef.length + 8];
+        System.arraycopy(Fields.longToBytes(node.bootID), 0, data, 0, 8);
+        System.arraycopy(myRef, 0, data, 8, myRef.length);
+        
+        byte[] myExp = ctx.getOurExponential().toByteArray();
+        byte[] hisExp = ctx.getHisExponential().toByteArray();
+        
+        MessageDigest md = SHA256.getMessageDigest();
         md.update(myExp);
         md.update(hisExp);
         md.update(data);
@@ -1454,20 +1500,6 @@
         }
         long firstTime = System.currentTimeMillis();
         handshakeIPs = pn.getHandshakeIPs();
-        long secondTime = System.currentTimeMillis();
-        if((secondTime - firstTime) > 1000)
-            Logger.error(this, "getHandshakeIPs() took more than a second to execute ("+(secondTime - firstTime)+") working on "+pn.getName());
-        if(handshakeIPs.length == 0) {
-            pn.couldNotSendHandshake();
-            long thirdTime = System.currentTimeMillis();
-            if((thirdTime - secondTime) > 1000)
-                Logger.error(this, "couldNotSendHandshake() (after getHandshakeIPs()) took more than a second to execute ("+(thirdTime - secondTime)+") working on "+pn.getName());
-            return;
-        } else {
-            long DHTime1 = System.currentTimeMillis();
-            ctx = DiffieHellman.generateContext();
-            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.setKeyAgreementSchemeContext(ctx);
             long DHTime3 = System.currentTimeMillis();




More information about the cvs mailing list