• Eric Biggers's avatar
    fscrypt: fix derivation of SipHash keys on big endian CPUs · 2fc2b430
    Eric Biggers authored
    Typically, the cryptographic APIs that fscrypt uses take keys as byte
    arrays, which avoids endianness issues.  However, siphash_key_t is an
    exception.  It is defined as 'u64 key[2];', i.e. the 128-bit key is
    expected to be given directly as two 64-bit words in CPU endianness.
    
    fscrypt_derive_dirhash_key() and fscrypt_setup_iv_ino_lblk_32_key()
    forgot to take this into account.  Therefore, the SipHash keys used to
    index encrypted+casefolded directories differ on big endian vs. little
    endian platforms, as do the SipHash keys used to hash inode numbers for
    IV_INO_LBLK_32-encrypted directories.  This makes such directories
    non-portable between these platforms.
    
    Fix this by always using the little endian order.  This is a breaking
    change for big endian platforms, but this should be fine in practice
    since these features (encrypt+casefold support, and the IV_INO_LBLK_32
    flag) aren't known to actually be used on any big endian platforms yet.
    
    Fixes: aa408f83 ("fscrypt: derive dirhash key for casefolded directories")
    Fixes: e3b1078b ("fscrypt: add support for IV_INO_LBLK_32 policies")
    Cc: <stable@vger.kernel.org> # v5.6+
    Link: https://lore.kernel.org/r/20210605075033.54424-1-ebiggers@kernel.orgSigned-off-by: default avatarEric Biggers <ebiggers@google.com>
    2fc2b430
keysetup.c 22.3 KB