On Sat, Jun 28, 2008 at 10:49 PM,  <toad at freenetproject.org> wrote:
> Author: toad
> Date: 2008-06-28 14:49:23 +0000 (Sat, 28 Jun 2008)
> New Revision: 20845
>
> Modified:
>   
> branches/db4o/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
> Log:
> Don't store the RNG here. Just store a seed created on startup.
>

If we restarted the node twice... The PRNG will be seeded with the
same seed in the two times...  -- Is this behavior expected?

IMO, make Node a static field would make the code much simpler in most
code -- we can refer to the node object when we need a prng, database,
etc.... For "many node in a jvm", we can use some ClassLoader
hacks....

> Modified: 
> branches/db4o/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
> ===================================================================
> --- 
> branches/db4o/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
>   2008-06-28 14:48:55 UTC (rev 20844)
> +++ 
> branches/db4o/freenet/src/freenet/support/io/PaddedEphemerallyEncryptedBucket.java
>   2008-06-28 14:49:23 UTC (rev 20845)
> @@ -18,6 +18,8 @@
>  import freenet.support.api.Bucket;
>  import java.util.Random;
>
> +import org.spaceroots.mantissa.random.MersenneTwister;
> +
>  import com.db4o.ObjectContainer;
>
>  /**
> @@ -29,10 +31,10 @@
>
>        private final Bucket bucket;
>        private final int minPaddedSize;
> -       private final Random randomSource;
>        private transient SoftReference /* <Rijndael> */ aesRef;
>        /** The decryption key. */
>        private final byte[] key;
> +       private final byte[] randomSeed;
>        private long dataLength;
>        private boolean readOnly;
>        private int lastOutputStream;
> @@ -49,10 +51,11 @@
>         * @throws UnsupportedCipherException
>         */
>        public PaddedEphemerallyEncryptedBucket(Bucket bucket, int minSize, 
> RandomSource strongPRNG, Random weakPRNG) {
> -               this.randomSource = weakPRNG;
>                this.bucket = bucket;
>                if(bucket.size() != 0) throw new 
> IllegalArgumentException("Bucket must be empty");
>                byte[] tempKey = new byte[32];
> +               randomSeed = new byte[32];
> +               weakPRNG.nextBytes(randomSeed);
>                strongPRNG.nextBytes(tempKey);
>                this.key = tempKey;
>                this.minPaddedSize = minSize;
> @@ -76,9 +79,10 @@
>                if(bucket.size() < knownSize)
>                        throw new IOException("Bucket "+bucket+" is too small 
> on disk - knownSize="+knownSize+" but bucket.size="+bucket.size()+" for 
> "+bucket);
>                this.dataLength = knownSize;
> -               this.randomSource = origRandom;
>                this.bucket = bucket;
>                if(key.length != 32) throw new IllegalArgumentException("Key 
> wrong length: "+key.length);
> +               randomSeed = new byte[32];
> +               origRandom.nextBytes(randomSeed);
>                this.key = key;
>                this.minPaddedSize = minSize;
>                readOnly = false;
> @@ -86,7 +90,6 @@
>        }
>
>        public PaddedEphemerallyEncryptedBucket(SimpleFieldSet fs, 
> RandomSource origRandom, PersistentFileTracker f) throws 
> CannotCreateFromFieldSetException {
> -               this.randomSource = origRandom;
>                String tmp = fs.get("DataLength");
>                if(tmp == null)
>                        throw new CannotCreateFromFieldSetException("No 
> DataLength");
> @@ -116,6 +119,8 @@
>                }
>                if(dataLength > bucket.size())
>                        throw new 
> CannotCreateFromFieldSetException("Underlying bucket "+bucket+" is too small: 
> should be "+dataLength+" actually "+bucket.size());
> +               randomSeed = new byte[32];
> +               origRandom.nextBytes(randomSeed);
>        }
>
>        public OutputStream getOutputStream() throws IOException {
> @@ -184,6 +189,7 @@
>                                        Logger.normal(this, "Not padding out 
> to length because have been superceded: "+getName());
>                                        return;
>                                }
> +                               Random random = new 
> MersenneTwister(randomSeed);
>                                
> synchronized(PaddedEphemerallyEncryptedBucket.this) {
>                                        long finalLength = paddedLength();
>                                        long padding = finalLength - 
> dataLength;
> @@ -191,7 +197,7 @@
>                                        long writtenPadding = 0;
>                                        while(writtenPadding < padding) {
>                                                int left = (int) 
> Math.min((padding - writtenPadding), (long)buf.length);
> -                                               randomSource.nextBytes(buf);
> +                                               random.nextBytes(buf);
>                                                out.write(buf, 0, left);
>                                                writtenPadding += left;
>                                        }
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
>

Reply via email to