Author: toad
Date: 2007-02-07 15:27:50 +0000 (Wed, 07 Feb 2007)
New Revision: 11684

Modified:
   trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
   trunk/freenet/src/freenet/crypt/DSAPublicKey.java
   trunk/freenet/src/freenet/crypt/DiffieHellmanContext.java
   trunk/freenet/src/freenet/crypt/SHA256.java
   trunk/freenet/src/freenet/crypt/StationToStationContext.java
   trunk/freenet/src/freenet/keys/CHKBlock.java
   trunk/freenet/src/freenet/keys/ClientCHKBlock.java
   trunk/freenet/src/freenet/keys/ClientKSK.java
   trunk/freenet/src/freenet/keys/ClientSSK.java
   trunk/freenet/src/freenet/keys/InsertableClientSSK.java
   trunk/freenet/src/freenet/keys/Key.java
   trunk/freenet/src/freenet/keys/NodeSSK.java
   trunk/freenet/src/freenet/keys/SSKBlock.java
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/LocationManager.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/SSKInsertSender.java
   trunk/freenet/src/freenet/support/io/BucketTools.java
Log:
Pool SHA256's.

Modified: trunk/freenet/src/freenet/clients/http/FProxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2007-02-07 
14:54:33 UTC (rev 11683)
+++ trunk/freenet/src/freenet/clients/http/FProxyToadlet.java   2007-02-07 
15:27:50 UTC (rev 11684)
@@ -486,7 +486,9 @@
                        throw new Error(e);
                }

-               return HexUtil.bytesToHex(md.digest(bos.toByteArray()));
+               String f = HexUtil.bytesToHex(md.digest(bos.toByteArray()));
+               SHA256.returnMessageDigest(md);
+               return f;
        }

        public static void maybeCreateFProxyEtc(NodeClientCore core, Node node, 
Config config, SubConfig fproxyConfig) throws IOException, 
InvalidConfigValueException {

Modified: trunk/freenet/src/freenet/crypt/DSAPublicKey.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DSAPublicKey.java   2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/crypt/DSAPublicKey.java   2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -142,7 +142,9 @@

     public byte[] asBytesHash() {
        MessageDigest md256 = SHA256.getMessageDigest();
-       return md256.digest(asBytes());
+       byte[] hash = md256.digest(asBytes());
+       SHA256.returnMessageDigest(md256);
+       return hash;
     }

     public byte[] asPaddedBytes() {

Modified: trunk/freenet/src/freenet/crypt/DiffieHellmanContext.java
===================================================================
--- trunk/freenet/src/freenet/crypt/DiffieHellmanContext.java   2007-02-07 
14:54:33 UTC (rev 11683)
+++ trunk/freenet/src/freenet/crypt/DiffieHellmanContext.java   2007-02-07 
15:27:50 UTC (rev 11684)
@@ -59,6 +59,7 @@

         md = SHA256.getMessageDigest();
         key = md.digest(sharedSecret.toByteArray());
+        SHA256.returnMessageDigest(md);
         if(logMINOR)
             Logger.minor(this, "Key="+HexUtil.bytesToHex(key));
         return key;

Modified: trunk/freenet/src/freenet/crypt/SHA256.java
===================================================================
--- trunk/freenet/src/freenet/crypt/SHA256.java 2007-02-07 14:54:33 UTC (rev 
11683)
+++ trunk/freenet/src/freenet/crypt/SHA256.java 2007-02-07 15:27:50 UTC (rev 
11684)
@@ -41,6 +41,7 @@

 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.util.Vector;

 import org.tanukisoftware.wrapper.WrapperManager;

@@ -322,12 +323,15 @@
        return HexUtil.bytesToHex(d);
     }

+    static private final Vector digests = new Vector();
+    
     /**
         * Create a new SHA-256 MessageDigest
         * Either succeed or stop the node.
         */
-       public  static MessageDigest getMessageDigest() {
+       public synchronized static MessageDigest getMessageDigest() {
            try {
+               if(!digests.isEmpty()) return (MessageDigest) digests.remove(0);
                return MessageDigest.getInstance("SHA-256");
            } catch (NoSuchAlgorithmException e2) {
                //TODO: maybe we should point to a HOWTO for freejvms
@@ -339,6 +343,26 @@
                return null;
        }

+       /**
+        * Return a MessageDigest to the pool.
+        * Must be SHA-256 !
+        */
+       public synchronized static void returnMessageDigest(MessageDigest 
md256) {
+               if(md256 == null) return;
+               String algo = md256.getAlgorithm();
+               if(!(algo.equals("SHA-256") || algo.equals("SHA256")))
+                       throw new IllegalArgumentException("Should be SHA-256 
but is "+algo);
+               md256.reset();
+               digests.add(md256);
+       }
+
+       public static byte[] digest(byte[] data) {
+               MessageDigest md = getMessageDigest();
+               byte[] hash = md.digest(data);
+               returnMessageDigest(md);
+               return hash;
+       }
+
        public static void main(String[] args) {
        byte[] buffer=new byte[1024];
        SHA256 s=new SHA256();

Modified: trunk/freenet/src/freenet/crypt/StationToStationContext.java
===================================================================
--- trunk/freenet/src/freenet/crypt/StationToStationContext.java        
2007-02-07 14:54:33 UTC (rev 11683)
+++ trunk/freenet/src/freenet/crypt/StationToStationContext.java        
2007-02-07 15:27:50 UTC (rev 11684)
@@ -91,7 +91,7 @@
        lastUsedTime = System.currentTimeMillis();
        if(hisExponential == null) throw new IllegalStateException("Can't call 
concatAndSignAndCrypt() until setOtherSideExponential() has been called!");
        if(key == null)  getKey();
-       
+
        MessageDigest md = SHA256.getMessageDigest();

        String message = "(" + myExponential + ',' + hisExponential + ')';
@@ -114,6 +114,8 @@
                e.printStackTrace();
        }

+       SHA256.returnMessageDigest(md);
+       
        return result;
     }

@@ -134,14 +136,17 @@
                is.close();

                if(signatureToCheck != null)
-                       if(DSA.verify(hisPubKey, new 
DSASignature(signatureToCheck), new BigInteger(md.digest(message.getBytes()))))
+                       if(DSA.verify(hisPubKey, new 
DSASignature(signatureToCheck), new BigInteger(md.digest(message.getBytes())))) 
{
+                               SHA256.returnMessageDigest(md);
                                return true;
+                       }

        } catch(IOException e){
                Logger.error(this, "Error :"+e);
                e.printStackTrace();
        }

+       SHA256.returnMessageDigest(md);
        return false;
     }


Modified: trunk/freenet/src/freenet/keys/CHKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/CHKBlock.java        2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/keys/CHKBlock.java        2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -81,6 +81,7 @@
         md.update(headers);
         md.update(data);
         byte[] hash = md.digest();
+        SHA256.returnMessageDigest(md);
         if(key == null) {
                chk = new NodeCHK(hash, cryptoAlgorithm);
         } else {

Modified: trunk/freenet/src/freenet/keys/ClientCHKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientCHKBlock.java  2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/keys/ClientCHKBlock.java  2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -101,10 +101,12 @@
         MessageDigest md256 = SHA256.getMessageDigest();
         byte[] dkey = md256.digest(dbuf);
         if(!java.util.Arrays.equals(dkey, key.cryptoKey)) {
+               SHA256.returnMessageDigest(md256);
             throw new CHKDecodeException("Check failed: decrypt key == 
H(data)");
         }
         // Check: IV == hash of decryption key
         byte[] predIV = md256.digest(dkey);
+        SHA256.returnMessageDigest(md256); md256 = null;
         // Extract the IV
         byte[] iv = new byte[32];
         System.arraycopy(hbuf, 0, iv, 0, 32);
@@ -112,9 +114,11 @@
             throw new CHKDecodeException("Check failed: Decrypted IV == 
H(decryption key)");
         // Checks complete
         int size = ((hbuf[32] & 0xff) << 8) + (hbuf[33] & 0xff);
-        if((size > 32768) || (size < 0))
+        if((size > 32768) || (size < 0)) {
             throw new CHKDecodeException("Invalid size: "+size);
-        return Key.decompress(dontCompress ? false : key.isCompressed(), dbuf, 
size, bf, Math.min(maxLength, MAX_LENGTH_BEFORE_COMPRESSION), 
key.compressionAlgorithm, false);
+        }
+        return Key.decompress(dontCompress ? false : key.isCompressed(), dbuf, 
size, bf, 
+                       Math.min(maxLength, MAX_LENGTH_BEFORE_COMPRESSION), 
key.compressionAlgorithm, false);
     }

     /**
@@ -190,6 +194,8 @@
         md256.update(header);
         byte[] finalHash = md256.digest(data);

+        SHA256.returnMessageDigest(md256);
+        
         // Now convert it into a ClientCHK
         key = new ClientCHK(finalHash, encKey, asMetadata, 
Key.ALGO_AES_PCFB_256_SHA256, compressionAlgorithm);


Modified: trunk/freenet/src/freenet/keys/ClientKSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientKSK.java       2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/keys/ClientKSK.java       2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -46,6 +46,7 @@
                DSAPublicKey pubKey = new DSAPublicKey(Global.DSAgroupBigA, 
privKey);
                byte[] pubKeyHash = md256.digest(pubKey.asBytes());
                try {
+                       SHA256.returnMessageDigest(md256);
                        return new ClientKSK(keyword, pubKeyHash, pubKey, 
privKey, keywordHash);
                } catch (MalformedURLException e) {
                        throw new Error(e);

Modified: trunk/freenet/src/freenet/keys/ClientSSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/ClientSSK.java       2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/keys/ClientSSK.java       2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -71,6 +71,7 @@
                } catch (UnsupportedCipherException e) {
                        throw new Error(e);
                }
+               SHA256.returnMessageDigest(md);
        }

        public ClientSSK(FreenetURI origURI) throws MalformedURLException {

Modified: trunk/freenet/src/freenet/keys/InsertableClientSSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/InsertableClientSSK.java     2007-02-07 
14:54:33 UTC (rev 11683)
+++ trunk/freenet/src/freenet/keys/InsertableClientSSK.java     2007-02-07 
15:27:50 UTC (rev 11684)
@@ -69,7 +69,9 @@
                DSAPublicKey pubKey = new DSAPublicKey(g, privKey);
                MessageDigest md = SHA256.getMessageDigest();
                md.update(pubKey.asBytes());
-               return new InsertableClientSSK(uri.getDocName(), md.digest(), 
pubKey, privKey, uri.getCryptoKey(), keyType);
+               byte[] pkHash = md.digest();
+               SHA256.returnMessageDigest(md);
+               return new InsertableClientSSK(uri.getDocName(), pkHash, 
pubKey, privKey, uri.getCryptoKey(), keyType);
        }

        public ClientSSKBlock encode(Bucket sourceData, boolean asMetadata, 
boolean dontCompress, short alreadyCompressedCodec, long sourceLength, 
RandomSource r) throws SSKEncodeException, IOException {
@@ -173,6 +175,7 @@
                if(x != SSKBlock.TOTAL_HEADERS_LENGTH)
                        throw new IllegalStateException("Too long");
                try {
+                       SHA256.returnMessageDigest(md256);
                        return new ClientSSKBlock(data, headers, this, false); 
// FIXME set last arg to true to not verify
                } catch (SSKVerifyException e) {
                        IllegalStateException exception=new 
IllegalStateException("Impossible encoding error: "+e.getMessage());
@@ -208,7 +211,10 @@
                DSAPublicKey pubKey = new DSAPublicKey(g, privKey);
                MessageDigest md = SHA256.getMessageDigest();
                try {
-                       return new InsertableClientSSK(docName, 
md.digest(pubKey.asBytes()), pubKey, privKey, ckey, 
Key.ALGO_AES_PCFB_256_SHA256);
+                       byte[] pkHash = md.digest(pubKey.asBytes());
+                       SHA256.returnMessageDigest(md);
+                       return new InsertableClientSSK(docName, pkHash, pubKey, 
privKey, ckey, 
+                                       Key.ALGO_AES_PCFB_256_SHA256);
                } catch (MalformedURLException e) {
                        throw new Error(e);
                }

Modified: trunk/freenet/src/freenet/keys/Key.java
===================================================================
--- trunk/freenet/src/freenet/keys/Key.java     2007-02-07 14:54:33 UTC (rev 
11683)
+++ trunk/freenet/src/freenet/keys/Key.java     2007-02-07 15:27:50 UTC (rev 
11684)
@@ -82,6 +82,7 @@
         md.update((byte)(TYPE >> 8));
         md.update((byte)TYPE);
         byte[] digest = md.digest();
+        SHA256.returnMessageDigest(md); md = null;
         long asLong = Math.abs(Fields.bytesToLong(digest));
         // Math.abs can actually return negative...
         if(asLong == Long.MIN_VALUE)

Modified: trunk/freenet/src/freenet/keys/NodeSSK.java
===================================================================
--- trunk/freenet/src/freenet/keys/NodeSSK.java 2007-02-07 14:54:33 UTC (rev 
11683)
+++ trunk/freenet/src/freenet/keys/NodeSSK.java 2007-02-07 15:27:50 UTC (rev 
11684)
@@ -56,6 +56,7 @@
                if(pubKey != null) {
                        MessageDigest md256 = SHA256.getMessageDigest();
                        byte[] hash = md256.digest(pubKey.asBytes());
+                       SHA256.returnMessageDigest(md256);
                        if(!Arrays.equals(hash, pkHash))
                                throw new SSKVerifyException("Invalid pubKey: 
wrong hash");
                }
@@ -71,7 +72,9 @@
                MessageDigest md256 = SHA256.getMessageDigest();
                md256.update(ehDocname);
                md256.update(pkHash);
-               return md256.digest();
+               byte[] key = md256.digest();
+               SHA256.returnMessageDigest(md256);
+               return key;
        }

        public void write(DataOutput _index) throws IOException {
@@ -126,8 +129,7 @@
                if(pubKey2 == null) return;
                if((pubKey == null) || !pubKey2.equals(pubKey)) {
                        if(pubKey2 != null) {
-                               MessageDigest md256 = SHA256.getMessageDigest();
-                               byte[] newPubKeyHash = 
md256.digest(pubKey2.asBytes());
+                               byte[] newPubKeyHash = 
SHA256.digest(pubKey2.asBytes());
                                if(Arrays.equals(pubKeyHash, newPubKeyHash)) {
                                        if(pubKey != null) {
                                                // same hash, yet different 
keys!

Modified: trunk/freenet/src/freenet/keys/SSKBlock.java
===================================================================
--- trunk/freenet/src/freenet/keys/SSKBlock.java        2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/keys/SSKBlock.java        2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -143,6 +143,7 @@
                }
                if(!Arrays.equals(ehDocname, nodeKey.encryptedHashedDocname))
                        throw new SSKVerifyException("E(H(docname)) wrong - 
wrong key?? \nfrom headers: "+HexUtil.bytesToHex(ehDocname)+"\nfrom key:     
"+HexUtil.bytesToHex(nodeKey.encryptedHashedDocname));
+               SHA256.returnMessageDigest(md);
        }

        public Key getKey() {

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-02-07 
14:54:33 UTC (rev 11683)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-02-07 
15:27:50 UTC (rev 11684)
@@ -171,6 +171,7 @@
         int ivLength = pcfb.lengthIV();
         MessageDigest md = SHA256.getMessageDigest();
         int digestLength = md.getDigestLength();
+        SHA256.returnMessageDigest(md);
         if(length < digestLength + ivLength + 4) {
             if(logMINOR) Logger.minor(this, "Too short: "+length+" should be 
at least "+(digestLength + ivLength + 4));
             return false;
@@ -393,10 +394,8 @@
         System.arraycopy(Fields.longToBytes(node.bootID), 0, data, 0, 8);
         System.arraycopy(myRef, 0, data, 8, myRef.length);

-        MessageDigest md = SHA256.getMessageDigest();
+        byte[] hash = SHA256.digest(data);

-        byte[] hash = md.digest(data);
-        
         pcfb.blockEncipher(hash, 0, hash.length);
         pcfb.blockEncipher(data, 0, data.length);

@@ -498,6 +497,7 @@
                        Logger.error(this, "Tried to send auth packet to local 
address: "+replyTo+" for "+pn);
                }
                if(logMINOR) Logger.minor(this, "Sending auth packet (long) to 
"+replyTo+" - size "+data.length+" data length: "+output.length);
+               SHA256.returnMessageDigest(md);
      }

     private void sendPacket(byte[] data, Peer replyTo, PeerNode pn, int 
alreadyReportedBytes) throws LocalAddressException {
@@ -548,6 +548,7 @@
         // Check the hash
         MessageDigest md = SHA256.getMessageDigest();
         byte[] realHash = md.digest(data);
+        SHA256.returnMessageDigest(md); md = null;
         if(Arrays.equals(realHash, hash)) {
             // Success!
             long bootID = Fields.bytesToLong(data);
@@ -701,6 +702,7 @@
         md.update(seqBuf);
         md.update(plaintext);
         byte[] realHash = md.digest();
+        SHA256.returnMessageDigest(md);

         // Now decrypt the original hash

@@ -1428,6 +1430,8 @@
         byte[] digestTemp;

         digestTemp = md.digest();
+        
+        SHA256.returnMessageDigest(md); md = null;

         if(logMINOR) Logger.minor(this, "\nHash:      
"+HexUtil.bytesToHex(digestTemp));


Modified: trunk/freenet/src/freenet/node/LocationManager.java
===================================================================
--- trunk/freenet/src/freenet/node/LocationManager.java 2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/node/LocationManager.java 2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -224,6 +224,8 @@
         }

         public void run() {
+            MessageDigest md = SHA256.getMessageDigest();
+            
             try {
             // We are already locked by caller
             // Because if we can't get lock they need to send a reject
@@ -232,8 +234,6 @@

             byte[] hisHash = 
((ShortBuffer)origMessage.getObject(DMT.HASH)).getData();

-            MessageDigest md = SHA256.getMessageDigest();
-            
             if(hisHash.length != md.getDigestLength()) {
                 Logger.error(this, "Invalid SwapRequest from peer: wrong 
length hash "+hisHash.length+" on "+uid);
                 // FIXME: Should we send a reject?
@@ -347,6 +347,7 @@
         } finally {
             unlock();
             removeRecentlyForwardedItem(item);
+            SHA256.returnMessageDigest(md);
         }
         }
     }
@@ -364,6 +365,7 @@
         public void run() {
             long uid = r.nextLong();            
             if(!lock()) return;
+            MessageDigest md = SHA256.getMessageDigest();
             try {
                 startedSwaps++;
                 // We can't lock friends_locations, so lets just
@@ -378,8 +380,6 @@
                     myValueLong[i+2] = Double.doubleToLongBits(friendLocs[i]);
                 byte[] myValue = Fields.longsToBytes(myValueLong);

-                MessageDigest md = SHA256.getMessageDigest();
-                
                 byte[] myHash = md.digest(myValue);

                 Message m = DMT.createFNPSwapRequest(uid, myHash, 6);
@@ -522,6 +522,7 @@
                 unlock();
                 if(item != null)
                     removeRecentlyForwardedItem(item);
+                SHA256.returnMessageDigest(md);
             }
         }


Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-02-07 14:54:33 UTC (rev 
11683)
+++ trunk/freenet/src/freenet/node/Node.java    2007-02-07 15:27:50 UTC (rev 
11684)
@@ -552,6 +552,7 @@
                MessageDigest md = SHA256.getMessageDigest();
                identityHash = md.digest(myIdentity);
                identityHashHash = md.digest(identityHash);
+               SHA256.returnMessageDigest(md); md = null;
                String loc = fs.get("location");
                Location l;
                try {
@@ -673,6 +674,7 @@
                this.myPubKey = new DSAPublicKey(myCryptoGroup, myPrivKey);
                myARK = InsertableClientSSK.createRandom(r, "ark");
                myARKNumber = 0;
+               SHA256.returnMessageDigest(md);
        }

        /**
@@ -1730,6 +1732,7 @@
                                try{
                                        MessageDigest md = 
SHA256.getMessageDigest();
                                        myReferenceSignature = 
DSA.sign(myCryptoGroup, myPrivKey, new 
BigInteger(md.digest(mySignedReference.getBytes("UTF-8"))), random);
+                                       SHA256.returnMessageDigest(md);
                                } catch(UnsupportedEncodingException e){
                                        //duh ?
                                        Logger.error(this, "Error while signing 
the node identity!"+e);
@@ -2592,6 +2595,7 @@
                                } else {
                                        Logger.error(this, "New hash is wrong");
                                }
+                               // REDFLAG don't recycle md256 because 
something wierd is happening if we are here
                                throw new IllegalArgumentException("Wrong 
hash?? Already have different key with same hash!");
                        }
                        cachedPubKeys.push(w, key);

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -627,6 +627,8 @@

                // Setup the queuedToSendN2NTMExtraPeerDataFileNumbers
                queuedToSendN2NTMExtraPeerDataFileNumbers = new HashSet();
+               
+               SHA256.returnMessageDigest(md);
     }

     private boolean parseARK(SimpleFieldSet fs, boolean onStartup) {

Modified: trunk/freenet/src/freenet/node/SSKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/SSKInsertSender.java 2007-02-07 14:54:33 UTC 
(rev 11683)
+++ trunk/freenet/src/freenet/node/SSKInsertSender.java 2007-02-07 15:27:50 UTC 
(rev 11684)
@@ -90,8 +90,7 @@
                throw new IllegalArgumentException("Must have pubkey to insert 
data!!");
        // pubKey.fingerprint() is not the same as hash(pubKey.asBytes())). 
FIXME it should be!
        byte[] pubKeyAsBytes = pubKey.asBytes();
-       MessageDigest md256 = SHA256.getMessageDigest();
-       pubKeyHash = md256.digest(pubKeyAsBytes);
+       pubKeyHash = SHA256.digest(pubKeyAsBytes);
        this.block = block;
        startTime = System.currentTimeMillis();
     }

Modified: trunk/freenet/src/freenet/support/io/BucketTools.java
===================================================================
--- trunk/freenet/src/freenet/support/io/BucketTools.java       2007-02-07 
14:54:33 UTC (rev 11683)
+++ trunk/freenet/src/freenet/support/io/BucketTools.java       2007-02-07 
15:27:50 UTC (rev 11684)
@@ -284,7 +284,9 @@
                                throw new EOFException();
                        if((bytesRead != bucketLength) && (bucketLength > 0))
                                throw new IOException("Read "+bytesRead+" but 
bucket length "+bucketLength+ '!');
-                       return md.digest();
+                       byte[] retval = md.digest();
+                       SHA256.returnMessageDigest(md);
+                       return retval;
                } finally {
                        if(is != null) is.close();
                }


Reply via email to