On Thu, 2014-09-11 at 22:47 +0100, Matthew Toseland wrote:
> On 11/09/14 22:42, Matthew Toseland wrote:
> > In order to implement disk encryption in purge-db4o, I'm reviewing one
> > of unixninja's crypto refactoring commits. This includes disk crypto but
> > also some important crypto infrastructure providing a single hopefully
> > clean API for our various different ciphers etc. I haven't looked at his
> > other commits, so I don't know whether something else was intended ...
> >
> > Lots of the code abuses ByteBuffer.array(), making very bad assumptions
> > about the ByteBuffer's passed in etc (not direct, not a slice,
> > arrayOffset() == 0, etc etc); this is fixed. (No criticism intended, NIO
> > is odd)
> >
> > CryptByteBuffer implements symmetric encryption:
> >
> > The main methods are:
> > public ByteBuffer encrypt(byte[] input, int offset, int len)
> > public ByteBuffer decrypt(byte[] input, int offset, int len)
> >
> > There are various wrappers e.g. ByteBuffer encrypt(ByteBuffer). This is
> > highly ambiguous: Lots of NIO code takes a ByteBuffer and returns the
> > same ByteBuffer. Here we are returning a different ByteBuffer. The
> > original code wasn't clear whether it was always a new buffer or
> > sometimes shared the array, anyway we have 3 requirements:
> > 1. The API must be unambiguous. Ambiguity -> very bad bugs, e.g. stuff
> > not getting encrypted. Hence e.g. we should not return a value if we are
> > encrypting in place; this is convenient but ambiguous.
> > 2. It needs to efficiently support encrypting in-place for big stuff:
> > Whole packets, whole CHKs.
> > 3. It needs to conveniently support small encryptions. These happen in
> > e.g. setting up an EncryptedRandomAccessThing (new class used for
> > encrypted random access tempfiles).
> >
> > Hence IMHO we should have:
> >
> > Base method:
> > void encrypt(byte[] buf, int offset, int length)
> >
> > Main convenience methods:
> > void encrypt(byte[] input, int offset, byte[] output, int outputOffset,
> > int length)
> > byte[] encryptCopy(byte[] input, int offset, int length)
> >
> > Along with the appropriate wrappers e.g.
> > encrypt(ByteBuffer input, ByteBuffer output)
> > Which should work with direct ByteBuffer's, and should encrypt the
> > gettable part of the input and put it to the output.
> I.e. it should not encrypt parts of the backing array that are not part
> of the ByteBuffer. E.g. ByteBuffer.equals() only considers the get()able
> part of the ByteBuffer, from the position to the capacity. All I'm
> saying there is we should use ByteBuffer's properly and not just pretend
> that they always have a backing array etc. Of course we can optimise the
> encryption if they do have one. But then we can optimise it in a
> different way if it's direct: Get from a ByteBuffer to a byte[], aligned
> with the block size, encrypt it, put to the other ByteBuffer.

All of the above sounds sane to me, provided we always use stream
ciphers (or a mode that emulates them). At the moment that's the case,
so I guess it will do :)

Florent

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
Devl mailing list
Devl@freenetproject.org
https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl

Reply via email to