07 Jan, 2021

1 commit

  • * aosp/upstream-f2fs-stable-linux-5.10.y:
    fs-verity: move structs needed for file signing to UAPI header
    fs-verity: rename "file measurement" to "file digest"
    fs-verity: rename fsverity_signed_digest to fsverity_formatted_digest
    fs-verity: remove filenames from file comments
    fscrypt: allow deleting files with unsupported encryption policy
    fscrypt: unexport fscrypt_get_encryption_info()
    fscrypt: move fscrypt_require_key() to fscrypt_private.h
    fscrypt: move body of fscrypt_prepare_setattr() out-of-line
    fscrypt: introduce fscrypt_prepare_readdir()
    ext4: don't call fscrypt_get_encryption_info() from dx_show_leaf()
    ubifs: remove ubifs_dir_open()
    f2fs: remove f2fs_dir_open()
    ext4: remove ext4_dir_open()
    fscrypt: simplify master key locking
    fscrypt: remove unnecessary calls to fscrypt_require_key()
    ubifs: prevent creating duplicate encrypted filenames
    f2fs: prevent creating duplicate encrypted filenames
    ext4: prevent creating duplicate encrypted filenames
    fscrypt: add fscrypt_is_nokey_name()
    fscrypt: remove kernel-internal constants from UAPI header

    Conflicts:
    fs/crypto/hooks.c

    Bug: 174873661
    Signed-off-by: Jaegeuk Kim
    Change-Id: Id56d42fc959242524628752223e9d773a2c8681c

    Jaegeuk Kim
     

29 Dec, 2020

9 commits

  • Currently it's impossible to delete files that use an unsupported
    encryption policy, as the kernel will just return an error when
    performing any operation on the top-level encrypted directory, even just
    a path lookup into the directory or opening the directory for readdir.

    More specifically, this occurs in any of the following cases:

    - The encryption context has an unrecognized version number. Current
    kernels know about v1 and v2, but there could be more versions in the
    future.

    - The encryption context has unrecognized encryption modes
    (FSCRYPT_MODE_*) or flags (FSCRYPT_POLICY_FLAG_*), an unrecognized
    combination of modes, or reserved bits set.

    - The encryption key has been added and the encryption modes are
    recognized but aren't available in the crypto API -- for example, a
    directory is encrypted with FSCRYPT_MODE_ADIANTUM but the kernel
    doesn't have CONFIG_CRYPTO_ADIANTUM enabled.

    It's desirable to return errors for most operations on files that use an
    unsupported encryption policy, but the current behavior is too strict.
    We need to allow enough to delete files, so that people can't be stuck
    with undeletable files when downgrading kernel versions. That includes
    allowing directories to be listed and allowing dentries to be looked up.

    Fix this by modifying the key setup logic to treat an unsupported
    encryption policy in the same way as "key unavailable" in the cases that
    are required for a recursive delete to work: preparing for a readdir or
    a dentry lookup, revalidating a dentry, or checking whether an inode has
    the same encryption policy as its parent directory.

    Reviewed-by: Andreas Dilger
    Link: https://lore.kernel.org/r/20201203022041.230976-10-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • Now that fscrypt_get_encryption_info() is only called from files in
    fs/crypto/ (due to all key setup now being handled by higher-level
    helper functions instead of directly by filesystems), unexport it and
    move its declaration to fscrypt_private.h.

    Reviewed-by: Andreas Dilger
    Link: https://lore.kernel.org/r/20201203022041.230976-9-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • fscrypt_require_key() is now only used by files in fs/crypto/. So
    reduce its visibility to fscrypt_private.h. This is also a prerequsite
    for unexporting fscrypt_get_encryption_info().

    Reviewed-by: Andreas Dilger
    Link: https://lore.kernel.org/r/20201203022041.230976-8-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • In preparation for reducing the visibility of fscrypt_require_key() by
    moving it to fscrypt_private.h, move the call to it from
    fscrypt_prepare_setattr() to an out-of-line function.

    Reviewed-by: Andreas Dilger
    Link: https://lore.kernel.org/r/20201203022041.230976-7-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • The last remaining use of fscrypt_get_encryption_info() from filesystems
    is for readdir (->iterate_shared()). Every other call is now in
    fs/crypto/ as part of some other higher-level operation.

    We need to add a new argument to fscrypt_get_encryption_info() to
    indicate whether the encryption policy is allowed to be unrecognized or
    not. Doing this is easier if we can work with high-level operations
    rather than direct filesystem use of fscrypt_get_encryption_info().

    So add a function fscrypt_prepare_readdir() which wraps the call to
    fscrypt_get_encryption_info() for the readdir use case.

    Reviewed-by: Andreas Dilger
    Link: https://lore.kernel.org/r/20201203022041.230976-6-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • The stated reasons for separating fscrypt_master_key::mk_secret_sem from
    the standard semaphore contained in every 'struct key' no longer apply.

    First, due to commit a992b20cd4ee ("fscrypt: add
    fscrypt_prepare_new_inode() and fscrypt_set_context()"),
    fscrypt_get_encryption_info() is no longer called from within a
    filesystem transaction.

    Second, due to commit d3ec10aa9581 ("KEYS: Don't write out to userspace
    while holding key semaphore"), the semaphore for the "keyring" key type
    no longer ranks above page faults.

    That leaves performance as the only possible reason to keep the separate
    mk_secret_sem. Specifically, having mk_secret_sem reduces the
    contention between setup_file_encryption_key() and
    FS_IOC_{ADD,REMOVE}_ENCRYPTION_KEY. However, these ioctls aren't
    executed often, so this doesn't seem to be worth the extra complexity.

    Therefore, simplify the locking design by just using key->sem instead of
    mk_secret_sem.

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

    Eric Biggers
     
  • In an encrypted directory, a regular dentry (one that doesn't have the
    no-key name flag) can only be created if the directory's encryption key
    is available.

    Therefore the calls to fscrypt_require_key() in __fscrypt_prepare_link()
    and __fscrypt_prepare_rename() are unnecessary, as these functions
    already check that the dentries they're given aren't no-key names.

    Remove these unnecessary calls to fscrypt_require_key().

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

    Eric Biggers
     
  • It's possible to create a duplicate filename in an encrypted directory
    by creating a file concurrently with adding the encryption key.

    Specifically, sys_open(O_CREAT) (or sys_mkdir(), sys_mknod(), or
    sys_symlink()) can lookup the target filename while the directory's
    encryption key hasn't been added yet, resulting in a negative no-key
    dentry. The VFS then calls ->create() (or ->mkdir(), ->mknod(), or
    ->symlink()) because the dentry is negative. Normally, ->create() would
    return -ENOKEY due to the directory's key being unavailable. However,
    if the key was added between the dentry lookup and ->create(), then the
    filesystem will go ahead and try to create the file.

    If the target filename happens to already exist as a normal name (not a
    no-key name), a duplicate filename may be added to the directory.

    In order to fix this, we need to fix the filesystems to prevent
    ->create(), ->mkdir(), ->mknod(), and ->symlink() on no-key names.
    (->rename() and ->link() need it too, but those are already handled
    correctly by fscrypt_prepare_rename() and fscrypt_prepare_link().)

    In preparation for this, add a helper function fscrypt_is_nokey_name()
    that filesystems can use to do this check. Use this helper function for
    the existing checks that fs/crypto/ does for rename and link.

    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20201118075609.120337-2-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • There isn't really any valid reason to use __FSCRYPT_MODE_MAX or
    FSCRYPT_POLICY_FLAGS_VALID in a userspace program. These constants are
    only meant to be used by the kernel internally, and they are defined in
    the UAPI header next to the mode numbers and flags only so that kernel
    developers don't forget to update them when adding new modes or flags.

    In https://lkml.kernel.org/r/20201005074133.1958633-2-satyat@google.com
    there was an example of someone wanting to use __FSCRYPT_MODE_MAX in a
    user program, and it was wrong because the program would have broken if
    __FSCRYPT_MODE_MAX were ever increased. So having this definition
    available is harmful. FSCRYPT_POLICY_FLAGS_VALID has the same problem.

    So, remove these definitions from the UAPI header. Replace
    FSCRYPT_POLICY_FLAGS_VALID with just listing the valid flags explicitly
    in the one kernel function that needs it. Move __FSCRYPT_MODE_MAX to
    fscrypt_private.h, remove the double underscores (which were only
    present to discourage use by userspace), and add a BUILD_BUG_ON() and
    comments to (hopefully) ensure it is kept in sync.

    Keep the old name FS_POLICY_FLAGS_VALID, since it's been around for
    longer and there's a greater chance that removing it would break source
    compatibility with some program. Indeed, mtd-utils is using it in
    an #ifdef, and removing it would introduce compiler warnings (about
    FS_POLICY_FLAGS_PAD_* being redefined) into the mtd-utils build.
    However, reduce its value to 0x07 so that it only includes the flags
    with old names (the ones present before Linux 5.4), and try to make it
    clear that it's now "frozen" and no new flags should be added to it.

    Fixes: 2336d0deb2d4 ("fscrypt: use FSCRYPT_ prefix for uapi constants")
    Cc: # v5.4+
    Link: https://lore.kernel.org/r/20201024005132.495952-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     

27 Dec, 2020

2 commits

  • In 5.10.3 the commit 3b7c17a81426 ("fscrypt: remove kernel-internal
    constants from UAPI header") removes __FSCRYPT_MODE_MAX so we need to
    fix up the out-of-tree crypto code in the android12-5.10 branch that
    uses it to keep the build working properly.

    Fixes: 3b7c17a81426 ("fscrypt: remove kernel-internal constants from UAPI header")

    Cc: Eric Biggers
    Signed-off-by: Greg Kroah-Hartman
    Change-Id: I8e6dc371e46d37583c488ccdaec500c46a9734a8

    Greg Kroah-Hartman
     
  • Changes in 5.10.3
    net: ipconfig: Avoid spurious blank lines in boot log
    x86/split-lock: Avoid returning with interrupts enabled
    exfat: Avoid allocating upcase table using kcalloc()
    soc/tegra: fuse: Fix index bug in get_process_id
    usb: mtu3: fix memory corruption in mtu3_debugfs_regset()
    USB: serial: option: add interface-number sanity check to flag handling
    USB: gadget: f_acm: add support for SuperSpeed Plus
    USB: gadget: f_midi: setup SuperSpeed Plus descriptors
    usb: gadget: f_fs: Re-use SS descriptors for SuperSpeedPlus
    USB: gadget: f_rndis: fix bitrate for SuperSpeed and above
    usb: chipidea: ci_hdrc_imx: Pass DISABLE_DEVICE_STREAMING flag to imx6ul
    ARM: dts: exynos: fix roles of USB 3.0 ports on Odroid XU
    ARM: dts: exynos: fix USB 3.0 VBUS control and over-current pins on Exynos5410
    ARM: dts: exynos: fix USB 3.0 pins supply being turned off on Odroid XU
    coresight: tmc-etf: Fix NULL ptr dereference in tmc_enable_etf_sink_perf()
    coresight: tmc-etr: Check if page is valid before dma_map_page()
    coresight: tmc-etr: Fix barrier packet insertion for perf buffer
    coresight: etb10: Fix possible NULL ptr dereference in etb_enable_perf()
    coresight: etm4x: Skip setting LPOVERRIDE bit for qcom, skip-power-up
    coresight: etm4x: Fix accesses to TRCVMIDCTLR1
    coresight: etm4x: Fix accesses to TRCCIDCTLR1
    coresight: etm4x: Fix accesses to TRCPROCSELR
    coresight: etm4x: Handle TRCVIPCSSCTLR accesses
    f2fs: fix to seek incorrect data offset in inline data file
    f2fs: init dirty_secmap incorrectly
    scsi: megaraid_sas: Check user-provided offsets
    HID: i2c-hid: add Vero K147 to descriptor override
    serial_core: Check for port state when tty is in error state
    fscrypt: remove kernel-internal constants from UAPI header
    fscrypt: add fscrypt_is_nokey_name()
    ubifs: prevent creating duplicate encrypted filenames
    ext4: prevent creating duplicate encrypted filenames
    f2fs: prevent creating duplicate encrypted filenames
    Bluetooth: Fix slab-out-of-bounds read in hci_le_direct_adv_report_evt()
    quota: Sanity-check quota file headers on load
    fs: quota: fix array-index-out-of-bounds bug by passing correct argument to vfs_cleanup_quota_inode()
    media: msi2500: assign SPI bus number dynamically
    crypto: af_alg - avoid undefined behavior accessing salg_name
    nl80211: validate key indexes for cfg80211_registered_device
    md: fix a warning caused by a race between concurrent md_ioctl()s
    Linux 5.10.3

    Signed-off-by: Greg Kroah-Hartman
    Change-Id: Ia12e3bc535549040a55f8dfb70921d99882e79f5

    Greg Kroah-Hartman
     

26 Dec, 2020

2 commits

  • commit 159e1de201b6fca10bfec50405a3b53a561096a8 upstream.

    It's possible to create a duplicate filename in an encrypted directory
    by creating a file concurrently with adding the encryption key.

    Specifically, sys_open(O_CREAT) (or sys_mkdir(), sys_mknod(), or
    sys_symlink()) can lookup the target filename while the directory's
    encryption key hasn't been added yet, resulting in a negative no-key
    dentry. The VFS then calls ->create() (or ->mkdir(), ->mknod(), or
    ->symlink()) because the dentry is negative. Normally, ->create() would
    return -ENOKEY due to the directory's key being unavailable. However,
    if the key was added between the dentry lookup and ->create(), then the
    filesystem will go ahead and try to create the file.

    If the target filename happens to already exist as a normal name (not a
    no-key name), a duplicate filename may be added to the directory.

    In order to fix this, we need to fix the filesystems to prevent
    ->create(), ->mkdir(), ->mknod(), and ->symlink() on no-key names.
    (->rename() and ->link() need it too, but those are already handled
    correctly by fscrypt_prepare_rename() and fscrypt_prepare_link().)

    In preparation for this, add a helper function fscrypt_is_nokey_name()
    that filesystems can use to do this check. Use this helper function for
    the existing checks that fs/crypto/ does for rename and link.

    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20201118075609.120337-2-ebiggers@kernel.org
    Signed-off-by: Eric Biggers
    Signed-off-by: Greg Kroah-Hartman

    Eric Biggers
     
  • commit 3ceb6543e9cf6ed87cc1fbc6f23ca2db903564cd upstream.

    There isn't really any valid reason to use __FSCRYPT_MODE_MAX or
    FSCRYPT_POLICY_FLAGS_VALID in a userspace program. These constants are
    only meant to be used by the kernel internally, and they are defined in
    the UAPI header next to the mode numbers and flags only so that kernel
    developers don't forget to update them when adding new modes or flags.

    In https://lkml.kernel.org/r/20201005074133.1958633-2-satyat@google.com
    there was an example of someone wanting to use __FSCRYPT_MODE_MAX in a
    user program, and it was wrong because the program would have broken if
    __FSCRYPT_MODE_MAX were ever increased. So having this definition
    available is harmful. FSCRYPT_POLICY_FLAGS_VALID has the same problem.

    So, remove these definitions from the UAPI header. Replace
    FSCRYPT_POLICY_FLAGS_VALID with just listing the valid flags explicitly
    in the one kernel function that needs it. Move __FSCRYPT_MODE_MAX to
    fscrypt_private.h, remove the double underscores (which were only
    present to discourage use by userspace), and add a BUILD_BUG_ON() and
    comments to (hopefully) ensure it is kept in sync.

    Keep the old name FS_POLICY_FLAGS_VALID, since it's been around for
    longer and there's a greater chance that removing it would break source
    compatibility with some program. Indeed, mtd-utils is using it in
    an #ifdef, and removing it would introduce compiler warnings (about
    FS_POLICY_FLAGS_PAD_* being redefined) into the mtd-utils build.
    However, reduce its value to 0x07 so that it only includes the flags
    with old names (the ones present before Linux 5.4), and try to make it
    clear that it's now "frozen" and no new flags should be added to it.

    Fixes: 2336d0deb2d4 ("fscrypt: use FSCRYPT_ prefix for uapi constants")
    Cc: # v5.4+
    Link: https://lore.kernel.org/r/20201024005132.495952-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers
    Signed-off-by: Greg Kroah-Hartman

    Eric Biggers
     

22 Dec, 2020

1 commit

  • This shifts the responsibility of setting up dentry operations from
    fscrypt to the individual filesystems, allowing them to have their own
    operations while still setting fscrypt's d_revalidate as appropriate.

    Most filesystems can just use generic_set_encrypted_ci_d_ops, unless
    they have their own specific dentry operations as well. That operation
    will set the minimal d_ops required under the circumstances.

    Since the fscrypt d_ops are set later on, we must set all d_ops there,
    since we cannot adjust those later on. This should not result in any
    change in behavior.

    Signed-off-by: Daniel Rosenberg
    Acked-by: Theodore Ts'o
    Acked-by: Eric Biggers
    Signed-off-by: Jaegeuk Kim

    Daniel Rosenberg
     

13 Nov, 2020

1 commit


12 Nov, 2020

2 commits

  • …kernel/git/viro/vfs") into android-mainline

    Steps on the way to 5.10-rc4

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

    Greg Kroah-Hartman
     
  • The new helper function fscrypt_prepare_new_inode() runs before
    S_ENCRYPTED has been set on the new inode. This accidentally made
    fscrypt_select_encryption_impl() never enable inline encryption on newly
    created files, due to its use of fscrypt_needs_contents_encryption()
    which only returns true when S_ENCRYPTED is set.

    Fix this by using S_ISREG() directly instead of
    fscrypt_needs_contents_encryption(), analogous to what
    select_encryption_mode() does.

    I didn't notice this earlier because by design, the user-visible
    behavior is the same (other than performance, potentially) regardless of
    whether inline encryption is used or not.

    Fixes: a992b20cd4ee ("fscrypt: add fscrypt_prepare_new_inode() and fscrypt_set_context()")
    Reviewed-by: Satya Tangirala
    Link: https://lore.kernel.org/r/20201111015224.303073-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     

07 Nov, 2020

1 commit

  • I_CREATING isn't actually set until the inode has been assigned an inode
    number and inserted into the inode hash table. So the WARN_ON() in
    fscrypt_setup_iv_ino_lblk_32_key() is wrong, and it can trigger when
    creating an encrypted file on ext4. Remove it.

    This was sometimes causing xfstest generic/602 to fail on ext4. I
    didn't notice it before because due to a separate oversight, new inodes
    that haven't been assigned an inode number yet don't necessarily have
    i_ino == 0 as I had thought, so by chance I never saw the test fail.

    Fixes: a992b20cd4ee ("fscrypt: add fscrypt_prepare_new_inode() and fscrypt_set_context()")
    Reported-by: Theodore Y. Ts'o
    Link: https://lore.kernel.org/r/20201031004556.87862-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     

23 Oct, 2020

1 commit


29 Sep, 2020

1 commit

  • Dentries that represent no-key names must have a dentry_operations that
    includes fscrypt_d_revalidate(). Currently, this is handled by
    fscrypt_prepare_lookup() installing fscrypt_d_ops.

    However, ceph support for encryption
    (https://lore.kernel.org/r/20200914191707.380444-1-jlayton@kernel.org)
    can't use fscrypt_d_ops, since ceph already has its own
    dentry_operations.

    Similarly, ext4 and f2fs support for directories that are both encrypted
    and casefolded
    (https://lore.kernel.org/r/20200923010151.69506-1-drosen@google.com)
    can't use fscrypt_d_ops either, since casefolding requires some dentry
    operations too.

    To satisfy both users, we need to move the responsibility of installing
    the dentry_operations to filesystems.

    In preparation for this, export fscrypt_d_revalidate() and give it a
    !CONFIG_FS_ENCRYPTION stub.

    Reviewed-by: Jeff Layton
    Link: https://lore.kernel.org/r/20200924054721.187797-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     

24 Sep, 2020

2 commits

  • Originally we used the term "encrypted name" or "ciphertext name" to
    mean the encoded filename that is shown when an encrypted directory is
    listed without its key. But these terms are ambiguous since they also
    mean the filename stored on-disk. "Encrypted name" is especially
    ambiguous since it could also be understood to mean "this filename is
    encrypted on-disk", similar to "encrypted file".

    So we've started calling these encoded names "no-key names" instead.

    Therefore, rename DCACHE_ENCRYPTED_NAME to DCACHE_NOKEY_NAME to avoid
    confusion about what this flag means.

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

    Eric Biggers
     
  • Currently we're using the term "ciphertext name" ambiguously because it
    can mean either the actual ciphertext filename, or the encoded filename
    that is shown when an encrypted directory is listed without its key.
    The latter we're now usually calling the "no-key name"; and while it's
    derived from the ciphertext name, it's not the same thing.

    To avoid this ambiguity, rename fscrypt_name::is_ciphertext_name to
    fscrypt_name::is_nokey_name, and update comments that say "ciphertext
    name" (or "encrypted name") to say "no-key name" instead when warranted.

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

    Eric Biggers
     

22 Sep, 2020

10 commits

  • Now that there's a library function that calculates the SHA-256 digest
    of a buffer in one step, use it instead of sha256_init() +
    sha256_update() + sha256_final().

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

    Eric Biggers
     
  • fscrypt_set_test_dummy_encryption() requires that the optional argument
    to the test_dummy_encryption mount option be specified as a substring_t.
    That doesn't work well with filesystems that use the new mount API,
    since the new way of parsing mount options doesn't use substring_t.

    Make it take the argument as a 'const char *' instead.

    Instead of moving the match_strdup() into the callers in ext4 and f2fs,
    make them just use arg->from directly. Since the pattern is
    "test_dummy_encryption=%s", the argument will be null-terminated.

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

    Eric Biggers
     
  • The behavior of the test_dummy_encryption mount option is that when a
    new file (or directory or symlink) is created in an unencrypted
    directory, it's automatically encrypted using a dummy encryption policy.
    That's it; in particular, the encryption (or lack thereof) of existing
    files (or directories or symlinks) doesn't change.

    Unfortunately the implementation of test_dummy_encryption is a bit weird
    and confusing. When test_dummy_encryption is enabled and a file is
    being created in an unencrypted directory, we set up an encryption key
    (->i_crypt_info) for the directory. This isn't actually used to do any
    encryption, however, since the directory is still unencrypted! Instead,
    ->i_crypt_info is only used for inheriting the encryption policy.

    One consequence of this is that the filesystem ends up providing a
    "dummy context" (policy + nonce) instead of a "dummy policy". In
    commit ed318a6cc0b6 ("fscrypt: support test_dummy_encryption=v2"), I
    mistakenly thought this was required. However, actually the nonce only
    ends up being used to derive a key that is never used.

    Another consequence of this implementation is that it allows for
    'inode->i_crypt_info != NULL && !IS_ENCRYPTED(inode)', which is an edge
    case that can be forgotten about. For example, currently
    FS_IOC_GET_ENCRYPTION_POLICY on an unencrypted directory may return the
    dummy encryption policy when the filesystem is mounted with
    test_dummy_encryption. That seems like the wrong thing to do, since
    again, the directory itself is not actually encrypted.

    Therefore, switch to a more logical and maintainable implementation
    where the dummy encryption policy inheritance is done without setting up
    keys for unencrypted directories. This involves:

    - Adding a function fscrypt_policy_to_inherit() which returns the
    encryption policy to inherit from a directory. This can be a real
    policy, a dummy policy, or no policy.

    - Replacing struct fscrypt_dummy_context, ->get_dummy_context(), etc.
    with struct fscrypt_dummy_policy, ->get_dummy_policy(), etc.

    - Making fscrypt_fname_encrypted_size() take an fscrypt_policy instead
    of an inode.

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

    Eric Biggers
     
  • In preparation for moving the logic for "get the encryption policy
    inherited by new files in this directory" to a single place, make
    fscrypt_prepare_symlink() a regular function rather than an inline
    function that wraps __fscrypt_prepare_symlink().

    This way, the new function fscrypt_policy_to_inherit() won't need to be
    exported to filesystems.

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

    Eric Biggers
     
  • The fscrypt UAPI header defines fscrypt_policy to fscrypt_policy_v1,
    for source compatibility with old userspace programs.

    Internally, the kernel doesn't want that compatibility definition.
    Instead, fscrypt_private.h #undefs it and re-defines it to a union.

    That works for now. However, in order to add
    fscrypt_operations::get_dummy_policy(), we'll need to forward declare
    'union fscrypt_policy' in include/linux/fscrypt.h. That would cause
    build errors because "fscrypt_policy" is used in ioctl numbers.

    To avoid this, modify the UAPI header to make the fscrypt_policy
    compatibility definition conditional on !__KERNEL__, and make the ioctls
    use fscrypt_policy_v1 instead of fscrypt_policy.

    Note that this doesn't change the actual ioctl numbers.

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

    Eric Biggers
     
  • 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
     
  • Now that all filesystems have been converted to use
    fscrypt_prepare_new_inode(), the encryption key for new symlink inodes
    is now already set up whenever we try to encrypt the symlink target.
    Enforce this rather than try to set up the key again when it may be too
    late to do so safely.

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

    Eric Biggers
     
  • Now that all filesystems have been converted to use
    fscrypt_prepare_new_inode() and fscrypt_set_context(),
    fscrypt_inherit_context() is no longer used. Remove it.

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

    Eric Biggers
     
  • Now that a fscrypt_info may be set up for inodes that are currently
    being created and haven't yet had an inode number assigned, avoid
    logging confusing messages about "inode 0".

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

    Eric Biggers
     
  • fscrypt_get_encryption_info() is intended to be GFP_NOFS-safe. But
    actually it isn't, since it uses functions like crypto_alloc_skcipher()
    which aren't GFP_NOFS-safe, even when called under memalloc_nofs_save().
    Therefore it can deadlock when called from a context that needs
    GFP_NOFS, e.g. during an ext4 transaction or between f2fs_lock_op() and
    f2fs_unlock_op(). This happens when creating a new encrypted file.

    We can't fix this by just not setting up the key for new inodes right
    away, since new symlinks need their key to encrypt the symlink target.

    So we need to set up the new inode's key before starting the
    transaction. But just calling fscrypt_get_encryption_info() earlier
    doesn't work, since it assumes the encryption context is already set,
    and the encryption context can't be set until the transaction.

    The recently proposed fscrypt support for the ceph filesystem
    (https://lkml.kernel.org/linux-fscrypt/20200821182813.52570-1-jlayton@kernel.org/T/#u)
    will have this same ordering problem too, since ceph will need to
    encrypt new symlinks before setting their encryption context.

    Finally, f2fs can deadlock when the filesystem is mounted with
    '-o test_dummy_encryption' and a new file is created in an existing
    unencrypted directory. Similarly, this is caused by holding too many
    locks when calling fscrypt_get_encryption_info().

    To solve all these problems, add new helper functions:

    - fscrypt_prepare_new_inode() sets up a new inode's encryption key
    (fscrypt_info), using the parent directory's encryption policy and a
    new random nonce. It neither reads nor writes the encryption context.

    - fscrypt_set_context() persists the encryption context of a new inode,
    using the information from the fscrypt_info already in memory. This
    replaces fscrypt_inherit_context().

    Temporarily keep fscrypt_inherit_context() around until all filesystems
    have been converted to use fscrypt_set_context().

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

    Eric Biggers
     

08 Sep, 2020

2 commits

  • When an encryption policy has the IV_INO_LBLK_32 flag set, the IV
    generation method involves hashing the inode number. This is different
    from fscrypt's other IV generation methods, where the inode number is
    either not used at all or is included directly in the IVs.

    Therefore, in principle IV_INO_LBLK_32 can work with any length inode
    number. However, currently fscrypt gets the inode number from
    inode::i_ino, which is 'unsigned long'. So currently the implementation
    limit is actually 32 bits (like IV_INO_LBLK_64), since longer inode
    numbers will have been truncated by the VFS on 32-bit platforms.

    Fix fscrypt_supported_v2_policy() to enforce the correct limit.

    This doesn't actually matter currently, since only ext4 and f2fs support
    IV_INO_LBLK_32, and they both only support 32-bit inode numbers. But we
    might as well fix it in case it matters in the future.

    Ideally inode::i_ino would instead be made 64-bit, but for now it's not
    needed. (Note, this limit does *not* prevent filesystems with 64-bit
    inode numbers from adding fscrypt support, since IV_INO_LBLK_* support
    is optional and is useful only on certain hardware.)

    Fixes: e3b1078bedd3 ("fscrypt: add support for IV_INO_LBLK_32 policies")
    Reported-by: Jeff Layton
    Link: https://lore.kernel.org/r/20200824203841.1707847-1-ebiggers@kernel.org
    Signed-off-by: Eric Biggers

    Eric Biggers
     
  • Signed-off-by: Jeff Layton
    Link: https://lore.kernel.org/r/20200810142139.487631-1-jlayton@kernel.org
    Signed-off-by: Eric Biggers

    Jeff Layton
     

12 Aug, 2020

1 commit

  • Fix a checkpatch warning that I fixed when applying
    ANDROID-fscrypt-add-support-for-hardware-wrapped-keys.patch to
    android12-5.4 (http://aosp/1394286). This gets android-mainline in
    sync.

    This should be folded into
    ANDROID-fscrypt-add-support-for-hardware-wrapped-keys.patch.

    Bug: 160883801
    Change-Id: Id615560edf4405a5b748cf402565d8f157298d3b
    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
     

07 Aug, 2020

1 commit


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