On Tue, Jul 1, 2008 at 8:33 PM, Matthew Toseland
<toad at amphibian.dyndns.org> wrote:
> On Sunday 29 June 2008 14:52, Daniel Cheng wrote:
>> 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?
>
> The PRNG is only instantiated when we need it for padding... what's the
> problem?
>>
>> 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....
>
> Yay God Object. :)
>
> When we have many node in a jvm, we want to be able to deal with them
> easily... e.g. in the simulation code. Not to have to go through 10 layers of
> indirection because of the hacks we're using.
The simulator is just ~1% of all source (in terms of line of code,
exclude unit test).
And we don't really need 10 layers of indirection...
I saw you passing the ObjectContainer and ClientContext around recently, hence
the suggestion.
> W.r.t. the database, it was a deliberate decision to pass it around, this
> makes writing relatively non-buggy code easier at this point. It could be
> changed later ... but the single-database-thread
> single-simultaneous-transaction design really doesn't go well with having
> static access to the database: it would be far too easy to just grab the
> database handle and write something, when there might be 10 other threads
> doing the same at the same time. So we'd have to use an embedded
> client-server design, which gives some benefits, but a number of major
> headaches too. Performance-wise I'm not sure it would be a benefit: what we
> gain in parallel reads/writes (which isn't always a gain especially on
> commodity drives), we lose in caching and refreshing.
>
> Having said that, the weak and strong random sources could reasonably be
> static. These are self-contained and can be common between many nodes. That's
> a sensible optimisation both to code quality and to performance.
>>
>> > 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
>> >
>> _______________________________________________
>> Devl mailing list
>> Devl at freenetproject.org
>> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
>>
>>
>
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
>