Author: nextgens
Date: 2008-02-07 12:37:10 +0000 (Thu, 07 Feb 2008)
New Revision: 17650

Modified:
   trunk/freenet/src/freenet/crypt/HMAC.java
   trunk/freenet/src/freenet/crypt/Util.java
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/NodeDispatcher.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Get rid of Digests in favour of MessageDigests so that the logic in the HMAC 
class is cleaner... and we can recycle MessageDigests

Modified: trunk/freenet/src/freenet/crypt/HMAC.java
===================================================================
--- trunk/freenet/src/freenet/crypt/HMAC.java   2008-02-07 12:34:02 UTC (rev 
17649)
+++ trunk/freenet/src/freenet/crypt/HMAC.java   2008-02-07 12:37:10 UTC (rev 
17650)
@@ -7,6 +7,8 @@
 import java.util.Arrays;

 import freenet.support.HexUtil;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;

 /**
  * Implements the HMAC Keyed Message Authentication function, as described
@@ -24,18 +26,10 @@
        }
     }

-    protected Digest d;
-
-    public HMAC(Digest d) {
-       this.d=d;
-    }
-
-    public int digestSize() {
-       return d.digestSize();
-    }
+    protected MessageDigest d;

-    public Digest getDigest() {
-       return d;
+    public HMAC(MessageDigest md) {
+           this.d = md;
     }

     public boolean verify(byte[] K, byte[] text, byte[] mac) {
@@ -87,7 +81,8 @@
     }

     public static void main(String[] args) throws UnsupportedEncodingException 
{
-       HMAC s=new HMAC(SHA1.getInstance());
+       HMAC s = null;
+       try { s = new HMAC(MessageDigest.getInstance("SHA1")); } catch 
(NoSuchAlgorithmException e) {}
        byte[] key=new byte[20];
        System.err.println("20x0b, 'Hi There':");
        byte[] text;
@@ -123,4 +118,27 @@

     }

+       public static byte[] macWithSHA256(byte[] K, byte[] text, int macbytes) 
{
+               MessageDigest sha256 = null;
+               try {
+                       sha256 = SHA256.getMessageDigest();
+                       HMAC hash = new HMAC(sha256);
+                       return hash.mac(K, text, macbytes);
+               } finally {
+                       if(sha256 != null)
+                               SHA256.returnMessageDigest(sha256);
+               }
+       }
+
+       public static boolean verifyWithSHA256(byte[] K, byte[] text, byte[] 
mac) {
+               MessageDigest sha256 = null;
+               try {
+                       sha256 = SHA256.getMessageDigest();
+                       HMAC hash = new HMAC(sha256);
+                       return hash.verify(K, text, mac);
+               } finally {
+                       if(sha256 != null)
+                               SHA256.returnMessageDigest(sha256);
+               }
+       }
 }      

Modified: trunk/freenet/src/freenet/crypt/Util.java
===================================================================
--- trunk/freenet/src/freenet/crypt/Util.java   2008-02-07 12:34:02 UTC (rev 
17649)
+++ trunk/freenet/src/freenet/crypt/Util.java   2008-02-07 12:37:10 UTC (rev 
17650)
@@ -14,6 +14,7 @@
 import freenet.crypt.ciphers.Rijndael;
 import freenet.support.HexUtil;
 import freenet.support.Loader;
+import java.security.MessageDigest;
 import net.i2p.util.NativeBigInteger;

 public class Util {
@@ -131,12 +132,12 @@
                return new NativeBigInteger(bl, r);
        }

-       public static byte[] hashBytes(Digest d, byte[] b) {
+       public static byte[] hashBytes(MessageDigest d, byte[] b) {
                return hashBytes(d, b, 0, b.length);
        }

        public static byte[] hashBytes(
-               Digest d,
+               MessageDigest d,
                byte[] b,
                int offset,
                int length) {

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-02-07 
12:34:02 UTC (rev 17649)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-02-07 
12:37:10 UTC (rev 17650)
@@ -819,8 +819,7 @@
                node.random.nextBytes(myNonce);
                byte[] r = 
ctx.signature.getRBytes(Node.SIGNATURE_PARAMETER_LENGTH);
                byte[] s = 
ctx.signature.getSBytes(Node.SIGNATURE_PARAMETER_LENGTH);
-               HMAC hash = new HMAC(SHA256.getInstance());
-               byte[] authenticator = 
hash.mac(getTransientKey(),assembleJFKAuthenticator(myExponential, 
hisExponential, myNonce, nonceInitator, replyTo.getAddress().getAddress()), 
HASH_LENGTH);
+               byte[] authenticator = 
HMAC.macWithSHA256(getTransientKey(),assembleJFKAuthenticator(myExponential, 
hisExponential, myNonce, nonceInitator, replyTo.getAddress().getAddress()), 
HASH_LENGTH);
                if(logMINOR) Logger.minor(this, "We are using the following 
HMAC : " + HexUtil.bytesToHex(authenticator));

                byte[] message2 = new 
byte[NONCE_SIZE*2+DiffieHellman.modulusLengthInBytes()+
@@ -1036,8 +1035,7 @@

                // We *WANT* to check the hmac before we do the lookup on the 
hashmap
                // @see https://bugs.freenetproject.org/view.php?id=1604
-               HMAC mac = new HMAC(SHA256.getInstance());
-               if(!mac.verify(getTransientKey(), 
assembleJFKAuthenticator(responderExponential, initiatorExponential, 
nonceResponder, nonceInitiator, replyTo.getAddress().getAddress()) , 
authenticator)) {
+               if(!HMAC.verifyWithSHA256(getTransientKey(), 
assembleJFKAuthenticator(responderExponential, initiatorExponential, 
nonceResponder, nonceInitiator, replyTo.getAddress().getAddress()) , 
authenticator)) {
                        if(shouldLogErrorInHandshake(t1))
                                Logger.normal(this, "The HMAC doesn't match; 
let's discard the packet (either we rekeyed or we are victim of forgery) - JFK3 
- "+pn);
                        return;
@@ -1080,7 +1078,7 @@
                System.arraycopy(JFK_PREFIX_INITIATOR, 0, decypheredPayload, 
decypheredPayloadOffset, JFK_PREFIX_INITIATOR.length);
                decypheredPayloadOffset += JFK_PREFIX_INITIATOR.length;
                System.arraycopy(payload, inputOffset, decypheredPayload, 
decypheredPayloadOffset, decypheredPayload.length-decypheredPayloadOffset);
-               if(!mac.verify(Ka, decypheredPayload, hmac)) {
+               if(!HMAC.verifyWithSHA256(Ka, decypheredPayload, hmac)) {
                        Logger.error(this, "The inner-HMAC doesn't match; let's 
discard the packet JFK(3) - "+pn);
                        return;
                }
@@ -1249,8 +1247,7 @@
                System.arraycopy(JFK_PREFIX_RESPONDER, 0, decypheredPayload, 
decypheredPayloadOffset, JFK_PREFIX_RESPONDER.length);
                decypheredPayloadOffset += JFK_PREFIX_RESPONDER.length;
                System.arraycopy(payload, inputOffset, decypheredPayload, 
decypheredPayloadOffset, payload.length-inputOffset);
-               HMAC mac = new HMAC(SHA256.getInstance());
-               if(!mac.verify(pn.jfkKa, decypheredPayload, hmac)) {
+               if(!HMAC.verifyWithSHA256(pn.jfkKa, decypheredPayload, hmac)) {
                        Logger.normal(this, "The digest-HMAC doesn't match; 
let's discard the packet - "+pn.getPeer());
                        return false;
                }
@@ -1429,8 +1426,7 @@
                pcfb.blockEncipher(cleartext, cleartextToEncypherOffset, 
cleartext.length-cleartextToEncypherOffset);

                // We compute the HMAC of (prefix + cyphertext) Includes the IV!
-               HMAC mac = new HMAC(SHA256.getInstance());
-               byte[] hmac = mac.mac(pn.jfkKa, cleartext, HASH_LENGTH);
+               byte[] hmac = HMAC.macWithSHA256(pn.jfkKa, cleartext, 
HASH_LENGTH);

                // copy stuffs back to the message
                System.arraycopy(hmac, 0, message3, offset, HASH_LENGTH);
@@ -1521,8 +1517,7 @@
                pk.blockEncipher(cyphertext, cleartextToEncypherOffset, 
cyphertext.length - cleartextToEncypherOffset);

                // We compute the HMAC of (prefix + iv + signature)
-               HMAC mac = new HMAC(SHA256.getInstance());
-               byte[] hmac = mac.mac(Ka, cyphertext, HASH_LENGTH);
+               byte[] hmac = HMAC.macWithSHA256(Ka, cyphertext, HASH_LENGTH);

                // Message4 = hmac + IV + encryptedSignature
                byte[] message4 = new byte[HASH_LENGTH + ivLength + 
(cyphertext.length - cleartextToEncypherOffset)]; 
@@ -2704,7 +2699,6 @@

        private byte[] computeJFKSharedKey(BigInteger exponential, byte[] nI, 
byte[] nR, String what) {
                assert("0".equals(what) || "1".equals(what) || 
"2".equals(what));
-               HMAC mac = new HMAC(SHA256.getInstance());
                byte[] number = null;
                try { number = what.getBytes("UTF-8"); } catch 
(UnsupportedEncodingException e) {}

@@ -2716,7 +2710,7 @@
                offset += NONCE_SIZE;
                System.arraycopy(number, 0, toHash, offset, number.length);

-               return mac.mac(exponential.toByteArray(), toHash, HASH_LENGTH);
+               return HMAC.macWithSHA256(exponential.toByteArray(), toHash, 
HASH_LENGTH);
        }

        private long timeLastReset = -1;

Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java  2008-02-07 12:34:02 UTC 
(rev 17649)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java  2008-02-07 12:37:10 UTC 
(rev 17650)
@@ -183,8 +183,7 @@
                Key key = (Key) m.getObject(DMT.KEY);
                byte[] authenticator = ((ShortBuffer) 
m.getObject(DMT.OFFER_AUTHENTICATOR)).getData();
                long uid = m.getLong(DMT.UID);
-               HMAC hash = new HMAC(SHA256.getInstance());
-               if(!hash.verify(node.failureTable.offerAuthenticatorKey, 
key.getFullKey(), authenticator)) {
+               
if(!HMAC.verifyWithSHA256(node.failureTable.offerAuthenticatorKey, 
key.getFullKey(), authenticator)) {
                        Logger.error(this, "Invalid offer request from 
"+source+" : authenticator did not verify");
                        try {
                                
source.sendAsync(DMT.createFNPGetOfferedKeyInvalid(uid, 
DMT.GET_OFFERED_KEY_REJECTED_BAD_AUTHENTICATOR), null, 0, null);

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2008-02-07 12:34:02 UTC 
(rev 17649)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2008-02-07 12:37:10 UTC 
(rev 17650)
@@ -3083,9 +3083,8 @@
        /** Offer a key to this node */
        public void offer(Key key) {
                byte[] keyBytes = key.getFullKey();
-               HMAC hash = new HMAC(SHA256.getInstance());
                // FIXME maybe the authenticator should be shorter than 32 
bytes to save memory?
-               byte[] authenticator = 
hash.mac(node.failureTable.offerAuthenticatorKey, keyBytes, 32);
+               byte[] authenticator = 
HMAC.macWithSHA256(node.failureTable.offerAuthenticatorKey, keyBytes, 32);
                Message msg = DMT.createFNPOfferKey(key, authenticator);
                try {
                        sendAsync(msg, null, 0, null);


Reply via email to