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();