[RFC] mtd: ubi: UBI Encryption

Richard Weinberger richard.weinberger at gmail.com
Mon Aug 10 23:30:30 PDT 2015


On Mon, Aug 10, 2015 at 9:56 PM, Andrew Murray
<amurray at embedded-bits.co.uk> wrote:
> We've recently implemented support for encryption within UBI for one of our
> customers and now wish to use this experience to provide a suitable solution
> for the community.
>
> Our current implementation works on real hardware and the latest linux-mtd
> kernel - however there are many issues that in my opinion make it unsuitable
> for the wider community. I'm keen to address these issues with feedback from
> linux-mtd such that we can get this in good shape. I'm happy to share the
> current implementation if it helps form the basis of a discussion that will
> address the general issues of adding encryption to UBI. (The diffstat for the
> current implementation is about 407 insertions).
>
> In summary:
>
>  - The approach I've taken is to intercept data between UBI and MTD (e.g.
>    mtd_read, mtd_write etc) and encrypt/decrypt it with the kernel crypto
>    framework (e.g. crypto_*). This is good because it de-couples encryption
>    from the rest of UBI, reduces/isolates complexity and ensures that everything
>    is indiscriminately encrypted. Though there may be a more obvious place to do
>    this.
>
>  - This approach is also bad because it breaks an assumption that UBI and UBIFS
>    make (as well as any other UBI users) that data returned from the MTD layer
>    containing 'all bits set' is erased flash. The same is also true for writing
>    data - for example when filling space with 0xFFs. Where we intercept and
>    encrypt/decrypt the 'all bits set' data we break the assumption because
>    we've turned it to garbage.
>
>  - My work around for this erased flash issue was to conditionally
>    encrypt/decrypt only when the input data is not 'all bits set'. This had
>    minimal impact on UBI/UBIFS/etc but it is possible (though very unlikely)
>    that the output of an encryption algorithm is 'all bits set' - Thus when you
>    later attempt to decrypt the 'all bits set' cipher text we incorrectly treat
>    it as erased flash so return it verbatim and thus cause corruption. I've not
>    seen this issue occur despite reading and writing more than 50GB of data.
>
>  - A better solution may be to correctly fix up the callers to the
>    'interception' layer such that they can choose to read raw or with
>    encryption. An example of where this would be needed is in 'torture_peb' -
>    after an erase the fuction reads back the flash to see if its 'all
> bits set'. This
>    seems like the right approach to me.
>
>  - I have implemented the 'better solution' and it appears to work - however
>    modifications are then needed to UBIFS in order for that to work. For example
>    when mounting UBIFS on empty flash it will scan and fail to find
>    UBIFS_NODE_MAGIC headers (as expected) - it will then determine that the
>    start scan wasn't empty space (as the 0xFFs have been decrypted into garbage)
>    and return an error. I believe this is the only issue I found with UBIFS.
>    (Of course another way to solve this would be to encrypt empty space - but
>    this would increase wear as the empty space (decrypted to 0xFFs) wouldn't
>    actually be erased flash thus requiring an additional erase prior to writing
>    data.).
>
>  - The current implementation  encrypts with cbc(aes) across fixed sized
>    units of hdrs_min_io_size - it also uses an IV based on the physcial offset
>    of the block and user provided IV. The key/IV is read from a fixed location
>    in flash. I'm not sure of the best way to manage/locate keys - this is
>    clearly a hack.

Hm, what do you mean by "read from a fixed location in flash"?
Did you change the UBI on-flash format to store new meta data?

How do you chain the encrypted blocks? You have to deal with bad blocks.
IOW if you lose a block it should only affect encrypted data with in
the same block.

>  - Encryption in UBI was preferred as it removed the complexity from userspace,
>    though I suppose there is no reason why this can't be done within the MTD
>    layer rather than in UBI and thus benefit all MTD users.

I'm not sure if UBI is the right layer for that. I'd do it in MTD to
have a dm_crypt like
MTD driver. At best it will be compatible with dm_crypt's userspace tools.

-- 
Thanks,
//richard



More information about the linux-mtd mailing list