Author: toad
Date: 2007-07-21 00:23:34 +0000 (Sat, 21 Jul 2007)
New Revision: 14221

Modified:
   trunk/freenet/src/freenet/client/ArchiveManager.java
   trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
   
trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucketFactory.java
   trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
Log:
Save more memory: PaddedEphemerallyEncryptedBucket: Create Rijndael lazily and 
cache it in a SoftReference

Modified: trunk/freenet/src/freenet/client/ArchiveManager.java
===================================================================
--- trunk/freenet/src/freenet/client/ArchiveManager.java        2007-07-21 
00:07:44 UTC (rev 14220)
+++ trunk/freenet/src/freenet/client/ArchiveManager.java        2007-07-21 
00:23:34 UTC (rev 14221)
@@ -446,7 +446,7 @@

                byte[] cipherKey = new byte[32];
                random.nextBytes(cipherKey);
-               PaddedEphemerallyEncryptedBucket encryptedBucket = new 
PaddedEphemerallyEncryptedBucket(fb, 1024, random, true);
+               PaddedEphemerallyEncryptedBucket encryptedBucket = new 
PaddedEphemerallyEncryptedBucket(fb, 1024, random);
                return new TempStoreElement(myFile, fb, encryptedBucket);
        }


Modified: 
trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java  
2007-07-21 00:07:44 UTC (rev 14220)
+++ trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java  
2007-07-21 00:23:34 UTC (rev 14221)
@@ -6,6 +6,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.ref.SoftReference;

 import org.spaceroots.mantissa.random.MersenneTwister;

@@ -28,8 +29,8 @@
        private final Bucket bucket;
        private final int minPaddedSize;
        private final RandomSource origRandom;
-       private final Rijndael aes;
-       /** The decryption key. May be null. */
+       private SoftReference /* <Rijndael> */ aesRef;
+       /** The decryption key. */
        private final byte[] key;
        /** Broken (old) encryption? */
        private final boolean brokenEncryption;
@@ -45,26 +46,14 @@
         * @param origRandom Hard random number generator from which to obtain 
a seed for padding.
         * @throws UnsupportedCipherException 
         */
-       public PaddedEphemerallyEncryptedBucket(Bucket bucket, int minSize, 
RandomSource origRandom, boolean forgetKey) {
+       public PaddedEphemerallyEncryptedBucket(Bucket bucket, int minSize, 
RandomSource origRandom) {
                this.origRandom = origRandom;
                this.bucket = bucket;
                if(bucket.size() != 0) throw new 
IllegalArgumentException("Bucket must be empty");
-               try {
-                       aes = new Rijndael(256, 256, false);
-               } catch (UnsupportedCipherException e) {
-                       throw new Error(e);
-               }
                brokenEncryption = false;
                byte[] tempKey = new byte[32];
                origRandom.nextBytes(tempKey);
-               aes.initialize(tempKey);
-               if(forgetKey) {
-                       // Might as well blank it
-                       for(int i=0;i<tempKey.length;i++) tempKey[i] = 0;
-                       this.key = null;
-               } else {
-                       this.key = tempKey;
-               }
+               this.key = tempKey;
                this.minPaddedSize = minSize;
                readOnly = false;
                lastOutputStream = 0;
@@ -88,12 +77,7 @@
                this.origRandom = origRandom;
                this.bucket = bucket;
                brokenEncryption = oldCrypto;
-               try {
-                       aes = new Rijndael(256, 256, oldCrypto);
-               } catch (UnsupportedCipherException e) {
-                       throw new Error(e);
-               }
-               aes.initialize(key);
+               if(key.length != 32) throw new IllegalArgumentException("Key 
wrong length: "+key.length);
                this.key = key;
                this.minPaddedSize = minSize;
                readOnly = false;
@@ -119,12 +103,7 @@
                        throw new CannotCreateFromFieldSetException("No key");
                brokenEncryption = fs.get("CryptoType") == null;
                key = HexUtil.hexToBytes(tmp);
-               try {
-                       aes = new Rijndael(256, 256, brokenEncryption);
-               } catch (UnsupportedCipherException e) {
-                       throw new Error(e);
-               }
-               aes.initialize(key);
+               if(key.length != 32) throw new IllegalArgumentException("Key 
wrong length: "+key.length);
                tmp = fs.get("MinPaddedSize");
                if(tmp == null)
                        minPaddedSize = 1024; // FIXME throw! back 
compatibility hack
@@ -159,6 +138,7 @@
                        this.out = out;
                        dataLength = 0;
                        this.streamNumber = streamNumber;
+                       Rijndael aes = getRijndael();
                        pcfb = PCFBMode.create(aes);
                }

@@ -235,6 +215,7 @@

                public PaddedEphemerallyEncryptedInputStream(InputStream in) {
                        this.in = in;
+                       Rijndael aes = getRijndael();
                        pcfb = PCFBMode.create(aes);
                        ptr = 0;
                }
@@ -310,6 +291,22 @@
                }
        }

+       private synchronized Rijndael getRijndael() {
+               Rijndael aes;
+               if(aesRef != null) {
+                       aes = (Rijndael) aesRef.get();
+                       if(aes != null) return aes;
+               }
+               try {
+                       aes = new Rijndael(256, 256, false);
+               } catch (UnsupportedCipherException e) {
+                       throw new Error(e);
+               }
+               aes.initialize(key);
+               aesRef = new SoftReference(aes);
+               return aes;
+       }
+
        public String getName() {
                return "Encrypted:"+bucket.getName();
        }
@@ -342,7 +339,7 @@
        }

        /**
-        * Get the decryption key. May have been blanked out.
+        * Get the decryption key.
         */
        public byte[] getKey() {
                return key;

Modified: 
trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucketFactory.java
===================================================================
--- 
trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucketFactory.java
   2007-07-21 00:07:44 UTC (rev 14220)
+++ 
trunk/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucketFactory.java
   2007-07-21 00:23:34 UTC (rev 14221)
@@ -23,6 +23,6 @@
        }

        public Bucket makeBucket(long size) throws IOException {
-               return new 
PaddedEphemerallyEncryptedBucket(baseFactory.makeBucket(size), minSize, random, 
true);
+               return new 
PaddedEphemerallyEncryptedBucket(baseFactory.makeBucket(size), minSize, random);
        }
 }

Modified: trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java
===================================================================
--- trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java       
2007-07-21 00:07:44 UTC (rev 14220)
+++ trunk/freenet/src/freenet/support/io/PersistentTempBucketFactory.java       
2007-07-21 00:23:34 UTC (rev 14221)
@@ -101,12 +101,12 @@

        public Bucket makeBucket(long size) throws IOException {
                Bucket b = makeRawBucket(size);
-               return new DelayedFreeBucket(this, new 
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
+               return new DelayedFreeBucket(this, new 
PaddedEphemerallyEncryptedBucket(b, 1024, rand));
        }

        public Bucket makeEncryptedBucket() throws IOException {
                Bucket b = makeRawBucket(-1);
-               return new DelayedFreeBucket(this, new 
PaddedEphemerallyEncryptedBucket(b, 1024, rand, false));
+               return new DelayedFreeBucket(this, new 
PaddedEphemerallyEncryptedBucket(b, 1024, rand));
        }

        /**


Reply via email to