31 Aug, 2019

1 commit

  • When getting fscrypt policy via EXT4_IOC_GET_ENCRYPTION_POLICY, if
    encryption feature is off, it's better to return EOPNOTSUPP instead of
    ENODATA, so let's add ext4_has_feature_encrypt() to do the check for
    that.

    This makes it so that all fscrypt ioctls consistently check for the
    encryption feature, and makes ext4 consistent with f2fs in this regard.

    Signed-off-by: Chao Yu
    [EB - removed unneeded braces, updated the documentation, and
    added more explanation to commit message]
    Signed-off-by: Eric Biggers

    Chao Yu
     

13 Aug, 2019

2 commits

  • Update the fscrypt documentation file to catch up to all the latest
    changes, including the new ioctls to manage master encryption keys in
    the filesystem-level keyring and the support for v2 encryption policies.

    Reviewed-by: Theodore Ts'o
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • Prefix all filesystem encryption UAPI constants except the ioctl numbers
    with "FSCRYPT_" rather than with "FS_". This namespaces the constants
    more appropriately and makes it clear that they are related specifically
    to the filesystem encryption feature, and to the 'fscrypt_*' structures.
    With some of the old names like "FS_POLICY_FLAGS_VALID", it was not
    immediately clear that the constant had anything to do with encryption.

    This is also useful because we'll be adding more encryption-related
    constants, e.g. for the policy version, and we'd otherwise have to
    choose whether to use unclear names like FS_POLICY_V1 or inconsistent
    names like FS_ENCRYPTION_POLICY_V1.

    For source compatibility with existing userspace programs, keep the old
    names defined as aliases to the new names.

    Finally, as long as new names are being defined anyway, I skipped
    defining new names for the fscrypt mode numbers that aren't actually
    used: INVALID (0), AES_256_GCM (2), AES_256_CBC (3), SPECK128_256_XTS
    (7), and SPECK128_256_CTS (8).

    Reviewed-by: Theodore Ts'o
    Signed-off-by: Eric Biggers

    Eric Biggers
     

28 Jun, 2019

2 commits

  • Document how to test ext4, f2fs, and ubifs encryption with xfstests.

    Reviewed-by: Theodore Ts'o
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • fscrypt only uses SHA-256 for AES-128-CBC-ESSIV, which isn't the default
    and is only recommended on platforms that have hardware accelerated
    AES-CBC but not AES-XTS. There's no link-time dependency, since SHA-256
    is requested via the crypto API on first use.

    To reduce bloat, we should limit FS_ENCRYPTION to selecting the default
    algorithms only. SHA-256 by itself isn't that much bloat, but it's
    being discussed to move ESSIV into a crypto API template, which would
    incidentally bring in other things like "authenc" support, which would
    all end up being built-in since FS_ENCRYPTION is now a bool.

    For Adiantum encryption we already just document that users who want to
    use it have to enable CONFIG_CRYPTO_ADIANTUM themselves. So, let's do
    the same for AES-128-CBC-ESSIV and CONFIG_CRYPTO_SHA256.

    Acked-by: Ard Biesheuvel
    Reviewed-by: Theodore Ts'o
    Signed-off-by: Eric Biggers

    Eric Biggers
     

24 Jan, 2019

2 commits

  • Currently, trying to rename or link a regular file, directory, or
    symlink into an encrypted directory fails with EPERM when the source
    file is unencrypted or is encrypted with a different encryption policy,
    and is on the same mountpoint. It is correct for the operation to fail,
    but the choice of EPERM breaks tools like 'mv' that know to copy rather
    than rename if they see EXDEV, but don't know what to do with EPERM.

    Our original motivation for EPERM was to encourage users to securely
    handle their data. Encrypting files by "moving" them into an encrypted
    directory can be insecure because the unencrypted data may remain in
    free space on disk, where it can later be recovered by an attacker.
    It's much better to encrypt the data from the start, or at least try to
    securely delete the source data e.g. using the 'shred' program.

    However, the current behavior hasn't been effective at achieving its
    goal because users tend to be confused, hack around it, and complain;
    see e.g. https://github.com/google/fscrypt/issues/76. And in some cases
    it's actually inconsistent or unnecessary. For example, 'mv'-ing files
    between differently encrypted directories doesn't work even in cases
    where it can be secure, such as when in userspace the same passphrase
    protects both directories. Yet, you *can* already 'mv' unencrypted
    files into an encrypted directory if the source files are on a different
    mountpoint, even though doing so is often insecure.

    There are probably better ways to teach users to securely handle their
    files. For example, the 'fscrypt' userspace tool could provide a
    command that migrates unencrypted files into an encrypted directory,
    acting like 'shred' on the source files and providing appropriate
    warnings depending on the type of the source filesystem and disk.

    Receiving errors on unimportant files might also force some users to
    disable encryption, thus making the behavior counterproductive. It's
    desirable to make encryption as unobtrusive as possible.

    Therefore, change the error code from EPERM to EXDEV so that tools
    looking for EXDEV will fall back to a copy.

    This, of course, doesn't prevent users from still doing the right things
    to securely manage their files. Note that this also matches the
    behavior when a file is renamed between two project quota hierarchies;
    so there's precedent for using EXDEV for things other than mountpoints.

    xfstests generic/398 will require an update with this change.

    [Rewritten from an earlier patch series by Michael Halcrow.]

    Cc: Michael Halcrow
    Cc: Joe Richey
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • In order to have a common code base for fscrypt "post read" processing
    for all filesystems which support encryption, this commit removes
    filesystem specific build config option (e.g. CONFIG_EXT4_FS_ENCRYPTION)
    and replaces it with a build option (i.e. CONFIG_FS_ENCRYPTION) whose
    value affects all the filesystems making use of fscrypt.

    Reviewed-by: Eric Biggers
    Signed-off-by: Chandan Rajendra
    Signed-off-by: Eric Biggers

    Chandan Rajendra
     

06 Jan, 2019

1 commit

  • Add support for the Adiantum encryption mode to fscrypt. Adiantum is a
    tweakable, length-preserving encryption mode with security provably
    reducible to that of XChaCha12 and AES-256, subject to a security bound.
    It's also a true wide-block mode, unlike XTS. See the paper
    "Adiantum: length-preserving encryption for entry-level processors"
    (https://eprint.iacr.org/2018/720.pdf) for more details. Also see
    commit 059c2a4d8e16 ("crypto: adiantum - add Adiantum support").

    On sufficiently long messages, Adiantum's bottlenecks are XChaCha12 and
    the NH hash function. These algorithms are fast even on processors
    without dedicated crypto instructions. Adiantum makes it feasible to
    enable storage encryption on low-end mobile devices that lack AES
    instructions; currently such devices are unencrypted. On ARM Cortex-A7,
    on 4096-byte messages Adiantum encryption is about 4 times faster than
    AES-256-XTS encryption; decryption is about 5 times faster.

    In fscrypt, Adiantum is suitable for encrypting both file contents and
    names. With filenames, it fixes a known weakness: when two filenames in
    a directory share a common prefix of >= 16 bytes, with CTS-CBC their
    encrypted filenames share a common prefix too, leaking information.
    Adiantum does not have this problem.

    Since Adiantum also accepts long tweaks (IVs), it's also safe to use the
    master key directly for Adiantum encryption rather than deriving
    per-file keys, provided that the per-file nonce is included in the IVs
    and the master key isn't used for any other encryption mode. This
    configuration saves memory and improves performance. A new fscrypt
    policy flag is added to allow users to opt-in to this configuration.

    Signed-off-by: Eric Biggers
    Signed-off-by: Theodore Ts'o

    Eric Biggers
     

04 Sep, 2018

1 commit

  • These are unused, undesired, and have never actually been used by
    anybody. The original authors of this code have changed their mind about
    its inclusion. While originally proposed for disk encryption on low-end
    devices, the idea was discarded [1] in favor of something else before
    that could really get going. Therefore, this patch removes Speck.

    [1] https://marc.info/?l=linux-crypto-vger&m=153359499015659

    Signed-off-by: Jason A. Donenfeld
    Acked-by: Eric Biggers
    Cc: stable@vger.kernel.org
    Acked-by: Ard Biesheuvel
    Signed-off-by: Herbert Xu

    Jason A. Donenfeld
     

21 May, 2018

1 commit

  • fscrypt currently only supports AES encryption. However, many low-end
    mobile devices have older CPUs that don't have AES instructions, e.g.
    the ARMv8 Cryptography Extensions. Currently, user data on such devices
    is not encrypted at rest because AES is too slow, even when the NEON
    bit-sliced implementation of AES is used. Unfortunately, it is
    infeasible to encrypt these devices at all when AES is the only option.

    Therefore, this patch updates fscrypt to support the Speck block cipher,
    which was recently added to the crypto API. The C implementation of
    Speck is not especially fast, but Speck can be implemented very
    efficiently with general-purpose vector instructions, e.g. ARM NEON.
    For example, on an ARMv7 processor, we measured the NEON-accelerated
    Speck128/256-XTS at 69 MB/s for both encryption and decryption, while
    AES-256-XTS with the NEON bit-sliced implementation was only 22 MB/s
    encryption and 19 MB/s decryption.

    There are multiple variants of Speck. This patch only adds support for
    Speck128/256, which is the variant with a 128-bit block size and 256-bit
    key size -- the same as AES-256. This is believed to be the most secure
    variant of Speck, and it's only about 6% slower than Speck128/128.
    Speck64/128 would be at least 20% faster because it has 20% rounds, and
    it can be even faster on CPUs that can't efficiently do the 64-bit
    operations needed for Speck128. However, Speck64's 64-bit block size is
    not preferred security-wise. ARM NEON also supports the needed 64-bit
    operations even on 32-bit CPUs, resulting in Speck128 being fast enough
    for our targeted use cases so far.

    The chosen modes of operation are XTS for contents and CTS-CBC for
    filenames. These are the same modes of operation that fscrypt defaults
    to for AES. Note that as with the other fscrypt modes, Speck will not
    be used unless userspace chooses to use it. Nor are any of the existing
    modes (which are all AES-based) being removed, of course.

    We intentionally don't make CONFIG_FS_ENCRYPTION select
    CONFIG_CRYPTO_SPECK, so people will have to enable Speck support
    themselves if they need it. This is because we shouldn't bloat the
    FS_ENCRYPTION dependencies with every new cipher, especially ones that
    aren't recommended for most users. Moreover, CRYPTO_SPECK is just the
    generic implementation, which won't be fast enough for many users; in
    practice, they'll need to enable CRYPTO_SPECK_NEON to get acceptable
    performance.

    More details about our choice of Speck can be found in our patches that
    added Speck to the crypto API, and the follow-on discussion threads.
    We're planning a publication that explains the choice in more detail.
    But briefly, we can't use ChaCha20 as we previously proposed, since it
    would be insecure to use a stream cipher in this context, with potential
    IV reuse during writes on f2fs and/or on wear-leveling flash storage.

    We also evaluated many other lightweight and/or ARX-based block ciphers
    such as Chaskey-LTS, RC5, LEA, CHAM, Threefish, RC6, NOEKEON, SPARX, and
    XTEA. However, all had disadvantages vs. Speck, such as insufficient
    performance with NEON, much less published cryptanalysis, or an
    insufficient security level. Various design choices in Speck make it
    perform better with NEON than competing ciphers while still having a
    security margin similar to AES, and in the case of Speck128 also the
    same available security levels. Unfortunately, Speck does have some
    political baggage attached -- it's an NSA designed cipher, and was
    rejected from an ISO standard (though for context, as far as I know none
    of the above-mentioned alternatives are ISO standards either).
    Nevertheless, we believe it is a good solution to the problem from a
    technical perspective.

    Certain algorithms constructed from ChaCha or the ChaCha permutation,
    such as MEM (Masked Even-Mansour) or HPolyC, may also meet our
    performance requirements. However, these are new constructions that
    need more time to receive the cryptographic review and acceptance needed
    to be confident in their security. HPolyC hasn't been published yet,
    and we are concerned that MEM makes stronger assumptions about the
    underlying permutation than the ChaCha stream cipher does. In contrast,
    the XTS mode of operation is relatively well accepted, and Speck has
    over 70 cryptanalysis papers. Of course, these ChaCha-based algorithms
    can still be added later if they become ready.

    The best known attack on Speck128/256 is a differential cryptanalysis
    attack on 25 of 34 rounds with 2^253 time complexity and 2^125 chosen
    plaintexts, i.e. only marginally faster than brute force. There is no
    known attack on the full 34 rounds.

    Signed-off-by: Eric Biggers
    Signed-off-by: Theodore Ts'o

    Eric Biggers
     

12 Jan, 2018

1 commit


01 Nov, 2017

1 commit

  • Perhaps long overdue, add a documentation file for filesystem-level
    encryption, a.k.a. fscrypt or fs/crypto/, to the Documentation
    directory. The new file is based loosely on the latest version of the
    "EXT4 Encryption Design Document (public version)" Google Doc, but with
    many improvements made, including:

    - Reflect the reality that it is not specific to ext4 anymore.
    - More thoroughly document the design and user-visible API/behavior.
    - Replace outdated information, such as the outdated explanation of how
    encrypted filenames are hashed for indexed directories and how
    encrypted filenames are presented to userspace without the key.
    (This was changed just before release.)

    For now the focus is on the design and user-visible API/behavior, not on
    how to add encryption support to a filesystem --- since the internal API
    is still pretty messy and any standalone documentation for it would
    become outdated as things get refactored over time.

    Reviewed-by: Michael Halcrow
    Signed-off-by: Eric Biggers
    Signed-off-by: Theodore Ts'o

    Eric Biggers