23 Oct, 2020

1 commit


22 Sep, 2020

1 commit

  • fscrypt_get_encryption_info() has never actually been safe to call in a
    context that needs GFP_NOFS, since it calls crypto_alloc_skcipher().

    crypto_alloc_skcipher() isn't GFP_NOFS-safe, even if called under
    memalloc_nofs_save(). This is because it may load kernel modules, and
    also because it internally takes crypto_alg_sem. Other tasks can do
    GFP_KERNEL allocations while holding crypto_alg_sem for write.

    The use of fscrypt_init_mutex isn't GFP_NOFS-safe either.

    So, stop pretending that fscrypt_get_encryption_info() is nofs-safe.
    I.e., when it allocates memory, just use GFP_KERNEL instead of GFP_NOFS.

    Note, another reason to do this is that GFP_NOFS is deprecated in favor
    of using memalloc_nofs_save() in the proper places.

    Acked-by: Jeff Layton
    Link: https://lore.kernel.org/r/20200917041136.178600-10-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     

08 Aug, 2020

2 commits

  • …kernel/git/sre/linux-power-supply") into android-mainline

    Merges along the way to 5.9-rc1

    resolves conflicts in:
    Documentation/ABI/testing/sysfs-class-power
    drivers/power/supply/power_supply_sysfs.c
    fs/crypto/inline_crypt.c

    Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
    Change-Id: Ia087834f54fb4e5269d68c3c404747ceed240701

    Greg Kroah-Hartman
     
  • As said by Linus:

    A symmetric naming is only helpful if it implies symmetries in use.
    Otherwise it's actively misleading.

    In "kzalloc()", the z is meaningful and an important part of what the
    caller wants.

    In "kzfree()", the z is actively detrimental, because maybe in the
    future we really _might_ want to use that "memfill(0xdeadbeef)" or
    something. The "zero" part of the interface isn't even _relevant_.

    The main reason that kzfree() exists is to clear sensitive information
    that should not be leaked to other future users of the same memory
    objects.

    Rename kzfree() to kfree_sensitive() to follow the example of the recently
    added kvfree_sensitive() and make the intention of the API more explicit.
    In addition, memzero_explicit() is used to clear the memory to make sure
    that it won't get optimized away by the compiler.

    The renaming is done by using the command sequence:

    git grep -w --name-only kzfree |\
    xargs sed -i 's/kzfree/kfree_sensitive/'

    followed by some editing of the kfree_sensitive() kerneldoc and adding
    a kzfree backward compatibility macro in slab.h.

    [akpm@linux-foundation.org: fs/crypto/inline_crypt.c needs linux/slab.h]
    [akpm@linux-foundation.org: fix fs/crypto/inline_crypt.c some more]

    Suggested-by: Joe Perches
    Signed-off-by: Waiman Long
    Signed-off-by: Andrew Morton
    Acked-by: David Howells
    Acked-by: Michal Hocko
    Acked-by: Johannes Weiner
    Cc: Jarkko Sakkinen
    Cc: James Morris
    Cc: "Serge E. Hallyn"
    Cc: Joe Perches
    Cc: Matthew Wilcox
    Cc: David Rientjes
    Cc: Dan Carpenter
    Cc: "Jason A . Donenfeld"
    Link: http://lkml.kernel.org/r/20200616154311.12314-3-longman@redhat.com
    Signed-off-by: Linus Torvalds

    Waiman Long
     

05 Aug, 2020

1 commit

  • …pub/scm/linux/kernel/git/jlayton/linux") into android-mainline

    Resolve merge conflicts in fs/crypto/ caused by the non-upstream changes
    for metadata encryption support [1] and wrapped key support [2].

    [1] https://android.googlesource.com/kernel/common-patches/+/refs/heads/master/android-mainline/ANDROID-dm-add-dm-default-key-target-for-metadata-encryption.patch
    [2] https://android.googlesource.com/kernel/common-patches/+/refs/heads/master/android-mainline/ANDROID-fscrypt-add-support-for-hardware-wrapped-keys.patch

    Conflicts:
    fs/crypto/fscrypt_private.h
    fs/crypto/inline_crypt.c
    fs/crypto/keysetup.c
    fs/crypto/keysetup_v1.c
    fs/f2fs/data.c
    include/linux/fscrypt.h

    Bug: 160885805
    Bug: 160883801
    Test: kvm-xfstests -c ext4,f2fs -g encrypt
    Change-Id: Icdc9e61b2286c78ba04cec1c9dca421bff545716
    Signed-off-by: Eric Biggers <ebiggers@google.com>

    Eric Biggers
     

21 Jul, 2020

1 commit

  • The name "FS_KEY_DERIVATION_NONCE_SIZE" is a bit outdated since due to
    the addition of FSCRYPT_POLICY_FLAG_DIRECT_KEY, the file nonce may now
    be used as a tweak instead of for key derivation. Also, we're now
    prefixing the fscrypt constants with "FSCRYPT_" instead of "FS_".

    Therefore, rename this constant to FSCRYPT_FILE_NONCE_SIZE.

    Link: https://lore.kernel.org/r/20200708215722.147154-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     

09 Jul, 2020

1 commit

  • Add support for inline encryption to fs/crypto/. With "inline
    encryption", the block layer handles the decryption/encryption as part
    of the bio, instead of the filesystem doing the crypto itself via
    Linux's crypto API. This model is needed in order to take advantage of
    the inline encryption hardware present on most modern mobile SoCs.

    To use inline encryption, the filesystem needs to be mounted with
    '-o inlinecrypt'. Blk-crypto will then be used instead of the traditional
    filesystem-layer crypto whenever possible to encrypt the contents
    of any encrypted files in that filesystem. Fscrypt still provides the key
    and IV to use, and the actual ciphertext on-disk is still the same;
    therefore it's testable using the existing fscrypt ciphertext verification
    tests.

    Note that since blk-crypto has a fallback to Linux's crypto API, and
    also supports all the encryption modes currently supported by fscrypt,
    this feature is usable and testable even without actual inline
    encryption hardware.

    Per-filesystem changes will be needed to set encryption contexts when
    submitting bios and to implement the 'inlinecrypt' mount option. This
    patch just adds the common code.

    Signed-off-by: Satya Tangirala
    Reviewed-by: Jaegeuk Kim
    Reviewed-by: Eric Biggers
    Reviewed-by: Theodore Ts'o
    Link: https://lore.kernel.org/r/20200702015607.1215430-3-satyat@google.com
    Co-developed-by: Eric Biggers
    Signed-off-by: Eric Biggers

    Satya Tangirala
     

18 Jun, 2020

1 commit

  • 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
     

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
     

31 Jan, 2020

1 commit

  • …cm/fs/fscrypt/fscrypt") into android-mainline

    Merge the upstream merge of fscrypt-for-linus, to resolve conflicts
    between the fscrypt changes that went upstream in 5.6 and the inline
    crypto and hardware-wrapped key support that is currently being carried
    in the Android common kernels.

    Conflicts:
    fs/crypto/Kconfig
    fs/crypto/bio.c
    fs/crypto/fname.c
    fs/crypto/fscrypt_private.h
    fs/crypto/keyring.c
    fs/crypto/keysetup.c
    include/uapi/linux/fscrypt.h

    Merge resolution notes:

    - In fscrypt_zeroout_range(), split the inline crypto case into a
    separate function fscrypt_zeroout_range_inlinecrypt(), as mixing the
    two cases together became much harder due to the upstream changes.

    - Allow the size of fscrypt-provisioning keys to be up to
    FSCRYPT_MAX_HW_WRAPPED_KEY_SIZE rather than FSCRYPT_MAX_KEY_SIZE.

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

    Eric Biggers
     

23 Jan, 2020

1 commit

  • Now that there's sometimes a second type of per-file key (the dirhash
    key), clarify some function names, macros, and documentation that
    specifically deal with per-file *encryption* keys.

    Link: https://lore.kernel.org/r/20200120223201.241390-4-ebiggers@kernel.org
    Reviewed-by: Daniel Rosenberg
    Signed-off-by: Eric Biggers

    Eric Biggers
     

21 Jan, 2020

1 commit

  • To prevent keys from being compromised if an attacker acquires read
    access to kernel memory, some inline encryption hardware supports
    protecting the keys in hardware without software having access to or the
    ability to set the plaintext keys. Instead, software only sees "wrapped
    keys", which may differ on every boot. The keys can be initially
    generated either by software (in which case they need to be imported to
    hardware to be wrapped), or directly by the hardware.

    Add support for this type of hardware by allowing keys to be flagged as
    hardware-wrapped and encryption policies to be flagged as needing a
    hardware-wrapped key. When used, fscrypt will pass the wrapped key
    directly to the inline encryption hardware to encrypt file contents.
    The hardware is responsible for internally unwrapping the key and
    deriving the actual file contents encryption key.

    fscrypt also asks the inline encryption hardware to derive a
    cryptographically isolated software "secret", which fscrypt then uses as
    the master key for all other purposes besides file contents encryption,
    e.g. to derive filenames encryption keys and the key identifier.

    Bug: 147209885

    Change-Id: I58d1a37f5ba8cf178b80036b813e0bc99512ef3b
    Co-developed-by: Gaurav Kashyap
    Signed-off-by: Gaurav Kashyap
    Signed-off-by: Barani Muthukumaran
    Signed-off-by: Eric Biggers

    Barani Muthukumaran
     

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
     

01 Jan, 2020

1 commit

  • FSCRYPT_POLICY_FLAG_DIRECT_KEY is currently only allowed with Adiantum
    encryption. But FS_IOC_SET_ENCRYPTION_POLICY allowed it in combination
    with other encryption modes, and an error wasn't reported until later
    when the encrypted directory was actually used.

    Fix it to report the error earlier by validating the correct use of the
    DIRECT_KEY flag in fscrypt_supported_policy(), similar to how we
    validate the IV_INO_LBLK_64 flag.

    Link: https://lore.kernel.org/r/20191209211829.239800-3-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     

31 Oct, 2019

1 commit

  • Instead of open-coding the calculations for ESSIV handling, use an ESSIV
    skcipher which does all of this under the hood. ESSIV was added to the
    crypto API in v5.4.

    This is based on a patch from Ard Biesheuvel, but reworked to apply
    after all the fscrypt changes that went into v5.4.

    Tested with 'kvm-xfstests -c ext4,f2fs -g encrypt', including the
    ciphertext verification tests for v1 and v2 encryption policies.

    Change-Id: I1b09160c0135a2d8b16db7b4139d22b903ec6a8e
    Originally-from: Ard Biesheuvel
    Acked-by: Ard Biesheuvel
    Signed-off-by: Eric Biggers
    Signed-off-by: Satya Tangirala
    Link: https://patchwork.kernel.org/patch/11182383/

    Eric Biggers
     

22 Oct, 2019

1 commit

  • Instead of open-coding the calculations for ESSIV handling, use an ESSIV
    skcipher which does all of this under the hood. ESSIV was added to the
    crypto API in v5.4.

    This is based on a patch from Ard Biesheuvel, but reworked to apply
    after all the fscrypt changes that went into v5.4.

    Tested with 'kvm-xfstests -c ext4,f2fs -g encrypt', including the
    ciphertext verification tests for v1 and v2 encryption policies.

    Originally-from: Ard Biesheuvel
    Acked-by: Ard Biesheuvel
    Signed-off-by: Eric Biggers

    Eric Biggers
     

13 Aug, 2019

2 commits

  • Add a new fscrypt policy version, "v2". It has the following changes
    from the original policy version, which we call "v1" (*):

    - Master keys (the user-provided encryption keys) are only ever used as
    input to HKDF-SHA512. This is more flexible and less error-prone, and
    it avoids the quirks and limitations of the AES-128-ECB based KDF.
    Three classes of cryptographically isolated subkeys are defined:

    - Per-file keys, like used in v1 policies except for the new KDF.

    - Per-mode keys. These implement the semantics of the DIRECT_KEY
    flag, which for v1 policies made the master key be used directly.
    These are also planned to be used for inline encryption when
    support for it is added.

    - Key identifiers (see below).

    - Each master key is identified by a 16-byte master_key_identifier,
    which is derived from the key itself using HKDF-SHA512. This prevents
    users from associating the wrong key with an encrypted file or
    directory. This was easily possible with v1 policies, which
    identified the key by an arbitrary 8-byte master_key_descriptor.

    - The key must be provided in the filesystem-level keyring, not in a
    process-subscribed keyring.

    The following UAPI additions are made:

    - The existing ioctl FS_IOC_SET_ENCRYPTION_POLICY can now be passed a
    fscrypt_policy_v2 to set a v2 encryption policy. It's disambiguated
    from fscrypt_policy/fscrypt_policy_v1 by the version code prefix.

    - A new ioctl FS_IOC_GET_ENCRYPTION_POLICY_EX is added. It allows
    getting the v1 or v2 encryption policy of an encrypted file or
    directory. The existing FS_IOC_GET_ENCRYPTION_POLICY ioctl could not
    be used because it did not have a way for userspace to indicate which
    policy structure is expected. The new ioctl includes a size field, so
    it is extensible to future fscrypt policy versions.

    - The ioctls FS_IOC_ADD_ENCRYPTION_KEY, FS_IOC_REMOVE_ENCRYPTION_KEY,
    and FS_IOC_GET_ENCRYPTION_KEY_STATUS now support managing keys for v2
    encryption policies. Such keys are kept logically separate from keys
    for v1 encryption policies, and are identified by 'identifier' rather
    than by 'descriptor'. The 'identifier' need not be provided when
    adding a key, since the kernel will calculate it anyway.

    This patch temporarily keeps adding/removing v2 policy keys behind the
    same permission check done for adding/removing v1 policy keys:
    capable(CAP_SYS_ADMIN). However, the next patch will carefully take
    advantage of the cryptographically secure master_key_identifier to allow
    non-root users to add/remove v2 policy keys, thus providing a full
    replacement for v1 policies.

    (*) Actually, in the API fscrypt_policy::version is 0 while on-disk
    fscrypt_context::format is 1. But I believe it makes the most sense
    to advance both to '2' to have them be in sync, and to consider the
    numbering to start at 1 except for the API quirk.

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

    Eric Biggers
     
  • In preparation for introducing v2 encryption policies which will find
    and derive encryption keys differently from the current v1 encryption
    policies, move the v1 policy-specific key setup code from keyinfo.c into
    keysetup_v1.c.

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

    Eric Biggers