07 Aug, 2020

1 commit


01 Jul, 2020

2 commits

  • generic_make_request has always been very confusingly misnamed, so rename
    it to submit_bio_noacct to make it clear that it is submit_bio minus
    accounting and a few checks.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     
  • fscrypt isn't supposed to try to use inline encryption if the key is
    wrapped but only blk-crypto-fallback is available. This logic got lost
    when updating to the latest inline encryption patchset. Restore it in
    blk_crypto_config_supported() where it should be now.

    Also drop a redundant check from blk_crypto_fallback_bio_prep().

    This fix should be folded into
    ANDROID-block-add-hardware-wrapped-key-support.patch

    Fixes: c2b86b727a41 ("FROMLIST: Update Inline Encryption from v6 to upstream version of patch series")
    Change-Id: I4f8a32ee30d700b499da36e55e74d279a86bb779
    Signed-off-by: Eric Biggers

    Eric Biggers
     

18 Jun, 2020

2 commits

  • …rnel.dk/linux-block") into android-mainline

    Conflicts:
    block/blk-core.c
    block/blk-crypto-fallback.c
    block/blk-crypto.c
    block/keyslot-manager.c
    drivers/md/dm.c
    include/linux/blk-crypto.h
    include/linux/blk_types.h
    include/linux/keyslot-manager.h

    Change-Id: Ie757c41fa41e6a9aacdf123d82d4f681623a02a8
    Signed-off-by: Eric Biggers <ebiggers@google.com>

    Eric Biggers
     
  • The block layer patches for inline encryption are now in upstream, so
    update Android to the upstream version of inline encryption. The
    fscrypt/f2fs/ext4 patches are also updated to the latest version sent
    upstream (since they can't be updated separately from the block layer
    patches).

    Changes v6 => v7:
    - Keyslot management is now done on a per-request basis rather than a
    per-bio basis.
    - Storage drivers can now specify the maximum number of bytes they
    can accept for the data unit number (DUN) for each crypto algorithm,
    and upper layers can specify the minimum number of bytes of DUN they
    want with the blk_crypto_key they send with the bio - a driver is
    only considered to support a blk_crypto_key if the driver supports at
    least as many DUN bytes as the upper layer wants. This is necessary
    because storage drivers may not support as many bytes as the
    algorithm specification dictates (for e.g. UFS only supports 8 byte
    DUNs for AES-256-XTS, even though the algorithm specification
    says DUNs are 16 bytes long).
    - Introduce SB_INLINECRYPT to keep track of whether inline encryption
    is enabled for a filesystem (instead of using an fscrypt_operation).
    - Expose keyslot manager declaration and embed it within ufs_hba to
    clean up code.
    - Make blk-crypto preclude blk-integrity.
    - Some bug fixes
    - Introduce UFSHCD_QUIRK_BROKEN_CRYPTO for UFS drivers that don't
    support inline encryption (yet)

    Changes v7 => v8:
    - Pass a struct blk_ksm_keyslot * around instead of slot numbers which
    simplifies some functions and passes around arguments with better types
    - Make bios with no encryption context avoid making calls into blk-crypto
    by checking for the presence of bi_crypt_context before making the call
    - Make blk-integrity preclude inline encryption support at probe time
    - Many many cleanups

    Changes v8 => v9:
    - Don't open code bio_has_crypt_ctx into callers of blk-crypto functions.
    - Lots of cleanups

    Changes v9 => v10:
    - Incorporate Eric's fix for allowing en/decryption to happen as usual via
    fscrypt in the case that hardware doesn't support the desired crypto
    configuration, but blk-crypto-fallback is disabled. (Introduce
    struct blk_crypto_config and blk_crypto_config_supported for fscrypt
    to call, to check that either blk-crypto-fallback is enabled or the
    device supports the crypto configuration).
    - Update docs
    - Lots of cleanups

    Changes v10 => v11:
    - We now allocate a new bio_crypt_ctx for each request instead of
    pulling and reusing the one in the bio inserted into the request. The
    bio_crypt_ctx of a bio is freed after the bio is ended.
    - Make each blk_ksm_keyslot store a pointer to the blk_crypto_key
    instead of a copy of the blk_crypto_key, so that each blk_crypto_key
    will have its own keyslot. We also won't need to compute the siphash
    for a blk_crypto_key anymore.
    - Minor cleanups

    Changes v11 => v12:
    - Inlined some fscrypt functions
    - Minor cleanups and improved comments

    Changes v12 => v13:
    - Updated docs
    - Minor cleanups
    - rebased onto linux-block/for-next

    Changes v13 => fscrypt/f2fs/ext4 upstream patch series
    - rename struct fscrypt_info::ci_key to ci_enc_key
    - set dun bytes more precisely in fscrypt
    - cleanups

    Bug: 137270441
    Test: Test cuttlefish boots both with and without inlinecrypt mount
    option specified in fstab, while using both F2FS and EXT4 for
    userdata.img. Also verified ciphertext via
    "atest -v vts_kernel_encryption_test"
    Also tested by running gce-xfstests on both the
    auto and encrypt test groups on EXT4 and F2FS both with and
    without the inlinecrypt mount option. The UFS changes were
    tested on a Pixel 4 device.
    Link: https://lore.kernel.org/linux-block/20200514003727.69001-1-satyat@google.com/
    Link: https://lore.kernel.org/linux-fscrypt/20200617075732.213198-1-satyat@google.com/
    Link: https://lore.kernel.org/linux-scsi/20200617081841.218985-1-satyat@google.com/
    Change-Id: I57c10d370bf006c9dfcf173f21a720413017761e
    Signed-off-by: Satya Tangirala
    Signed-off-by: Eric Biggers

    Satya Tangirala
     

27 May, 2020

1 commit


14 May, 2020

1 commit

  • Blk-crypto delegates crypto operations to inline encryption hardware
    when available. The separately configurable blk-crypto-fallback contains
    a software fallback to the kernel crypto API - when enabled, blk-crypto
    will use this fallback for en/decryption when inline encryption hardware
    is not available.

    This lets upper layers not have to worry about whether or not the
    underlying device has support for inline encryption before deciding to
    specify an encryption context for a bio. It also allows for testing
    without actual inline encryption hardware - in particular, it makes it
    possible to test the inline encryption code in ext4 and f2fs simply by
    running xfstests with the inlinecrypt mount option, which in turn allows
    for things like the regular upstream regression testing of ext4 to cover
    the inline encryption code paths.

    For more details, refer to Documentation/block/inline-encryption.rst.

    Signed-off-by: Satya Tangirala
    Reviewed-by: Eric Biggers
    Signed-off-by: Jens Axboe

    Satya Tangirala
     

05 Apr, 2020

2 commits

  • We need a way to tell which type of keys the inline crypto hardware
    supports (standard, wrapped, or both), so that fallbacks can be used
    when needed (either blk-crypto-fallback, or fscrypt fs-layer crypto).

    We can't simply assume that

    keyslot_mgmt_ll_ops::derive_raw_secret == NULL

    means only standard keys are supported and that

    keyslot_mgmt_ll_ops::derive_raw_secret != NULL

    means that only wrapped keys are supported, because device-mapper
    devices always implement this method. Also, hardware might support both
    types of keys.

    Therefore, add a field keyslot_manager::features which contains a
    bitmask of flags which indicate the supported types of keys. Drivers
    will need to fill this in. This patch makes the UFS standard crypto
    code set BLK_CRYPTO_FEATURE_STANDARD_KEYS, but UFS variant drivers may
    need to set BLK_CRYPTO_FEATURE_WRAPPED_KEYS instead.

    Then, make keyslot_manager_crypto_mode_supported() take the key type
    into account.

    Bug: 137270441
    Bug: 151100202
    Test: 'atest vts_kernel_encryption_test' on Pixel 4 with the
    inline crypto patches backported, and also on Cuttlefish.
    Change-Id: Ied846c2767c1fd2f438792dcfd3649157e68b005
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • If blk-crypto-fallback is needed but is disabled by kconfig, make
    blk_crypto_start_using_mode() return an error rather than succeeding.
    Use ENOPKG, which matches the error code used by fscrypt when crypto API
    support is missing with fs-layer encryption.

    Also, if blk-crypto-fallback is needed but the algorithm is missing from
    the kernel's crypto API, change the error code from ENOENT to ENOPKG.

    This is needed for VtsKernelEncryptionTest to pass on some devices.

    Bug: 137270441
    Bug: 151100202
    Test: 'atest vts_kernel_encryption_test' on Pixel 4 with the
    inline crypto patches backported, and also on Cuttlefish.
    Change-Id: Iedf00ca8e48c74a5d4c40b12712f38738a04ef11
    Signed-off-by: Eric Biggers

    Eric Biggers
     

21 Feb, 2020

1 commit

  • The call to pm_runtime_get_sync() in ufshcd_program_key() can deadlock
    because it waits for the UFS controller to be resumed, but it can itself
    be reached while resuming the UFS controller via:

    - ufshcd_runtime_resume()
    - ufshcd_resume()
    - ufshcd_reset_and_restore()
    - ufshcd_host_reset_and_restore()
    - ufshcd_hba_enable()
    - ufshcd_hba_execute_hce()
    - ufshcd_hba_start()
    - ufshcd_crypto_enable()
    - keyslot_manager_reprogram_all_keys()
    - ufshcd_crypto_keyslot_program()
    - ufshcd_program_key()

    But pm_runtime_get_sync() *is* needed when evicting a key. Also, on
    pre-4.20 kernels it's needed when programming a keyslot for a bio since
    the block layer used to resume the device in a different place.

    Thus, it's hard for drivers to know what to do in .keyslot_program() and
    .keyslot_evict(). In old kernels it may even be impossible unless we
    were to pass more information down from the keyslot_manager.

    There's also another possible deadlock: keyslot programming and eviction
    take ksm->lock for write and then resume the device, which may result in
    ksm->lock being taken again via the above call stack. To fix this, we
    should resume the device before taking ksm->lock.

    Fix these problems by moving to a better design where the block layer
    (namely, the keyslot manager) handles runtime power management instead
    of drivers. This is analogous to the block layer's existing runtime
    power management support (blk-pm), which handles resuming devices when
    bios are submitted to them so that drivers don't need to handle it.

    Test: Tested on coral with:
    echo 5 > /sys/bus/platform/devices/1d84000.ufshc/rpm_lvl
    sleep 30
    touch /data && sync # hangs before this fix
    Also verified via kvm-xfstests that blk-crypto-fallback continues
    to work both with and without CONFIG_PM=y.

    Bug: 137270441
    Bug: 149368295
    Change-Id: I6bc9fb81854afe7edf490d71796ee68a61f7cbc8
    Signed-off-by: Eric Biggers

    Eric Biggers
     

13 Feb, 2020

1 commit

  • blk-crypto-fallback does not support wrapped keys, hence
    prevent falling back when program_key fails. Add 'is_hw_wrapped'
    flag to blk-crypto-key to mention if the key is wrapped
    when the key is initialized.

    Bug: 147209885

    Test: Validate FBE, simulate a failure in the underlying blk
    device and ensure the call fails without falling back
    to blk-crypto-fallback.

    Change-Id: I8bc301ca1ac9e55ba6ab622e8325486916b45c56
    Signed-off-by: Barani Muthukumaran

    Barani Muthukumaran
     

25 Jan, 2020

3 commits

  • Add a device-mapper target "dm-default-key" which assigns an encryption
    key to bios that aren't for the contents of an encrypted file.

    This ensures that all blocks on-disk will be encrypted with some key,
    without the performance hit of file contents being encrypted twice when
    fscrypt (File-Based Encryption) is used.

    It is only appropriate to use dm-default-key when key configuration is
    tightly controlled, like it is in Android, such that all fscrypt keys
    are at least as hard to compromise as the default key.

    Compared to the original version of dm-default-key, this has been
    modified to use the new vendor-independent inline encryption framework
    (which works even when no inline encryption hardware is present), the
    table syntax has been changed to match dm-crypt, and support for
    specifying Adiantum encryption has been added. These changes also mean
    that dm-default-key now always explicitly specifies the DUN (the IV).

    Also, to handle f2fs moving blocks of encrypted files around without the
    key, and to handle ext4 and f2fs filesystems mounted without
    '-o inlinecrypt', the mapping logic is no longer "set a key on the bio
    if it doesn't have one already", but rather "set a key on the bio unless
    the bio has the bi_skip_dm_default_key flag set". Filesystems set this
    flag on *all* bios for encrypted file contents, regardless of whether
    they are encrypting/decrypting the file using inline encryption or the
    traditional filesystem-layer encryption, or moving the raw data.

    For the bi_skip_dm_default_key flag, a new field in struct bio is used
    rather than a bit in bi_opf so that fscrypt_set_bio_crypt_ctx() can set
    the flag, minimizing the changes needed to filesystems. (bi_opf is
    usually overwritten after fscrypt_set_bio_crypt_ctx() is called.)

    Bug: 137270441
    Bug: 147814592
    Change-Id: I69c9cd1e968ccf990e4ad96e5115b662237f5095
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • Export the blk-crypto symbols needed for modules to use inline crypto.

    These would have already been exported, except that so far they've only
    been used by fs/crypto/, which is no longer modular.

    Bug: 137270441
    Bug: 147814592
    Change-Id: I64bf98aecabe891c188b30dd50124aacb1e008ca
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • While we're waiting for v7 of the inline crypto patchset, fix some bugs
    that made it into the v6 patchset, including one that caused bios with
    an encryption context to never be merged, and one that could cause
    non-contiguous pages to incorrectly added to a bio.

    Bug: 137270441
    Change-Id: I3911fcd6c76b5c9063b86d6af6267ad990a46718
    Signed-off-by: Eric Biggers

    Eric Biggers
     

13 Jan, 2020

1 commit

  • Changes v5 => v6:
    - Blk-crypto's kernel crypto API fallback is no longer restricted to
    8-byte DUNs. It's also now separately configurable from blk-crypto, and
    can be disabled entirely, while still allowing the kernel to use inline
    encryption hardware. Further, struct bio_crypt_ctx takes up less space,
    and no longer contains the information needed by the crypto API
    fallback - the fallback allocates the required memory when necessary.
    - Blk-crypto now supports all file content encryption modes supported by
    fscrypt.
    - Fixed bio merging logic in blk-merge.c
    - Fscrypt now supports inline encryption with the direct key policy, since
    blk-crypto now has support for larger DUNs.
    - Keyslot manager now uses a hashtable to lookup which keyslot contains
    any particular key (thanks Eric!)
    - Fscrypt support for inline encryption now handles filesystems with
    multiple underlying block devices (thanks Eric!)
    - Numerous cleanups

    Bug: 137270441
    Test: refer to I26376479ee38259b8c35732cb3a1d7e15f9b05a3
    Change-Id: I13e2e327e0b4784b394cb1e7cf32a04856d95f01
    Link: https://lore.kernel.org/linux-block/20191218145136.172774-1-satyat@google.com/
    Signed-off-by: Satya Tangirala

    Satya Tangirala