On Mon, 2020-08-24 at 11:21 -0700, Eric Biggers wrote: > On Mon, Aug 24, 2020 at 12:48:48PM -0400, Jeff Layton wrote: > > > +void fscrypt_hash_inode_number(struct fscrypt_info *ci, > > > + const struct fscrypt_master_key *mk) > > > +{ > > > + WARN_ON(ci->ci_inode->i_ino == 0); > > > + WARN_ON(!mk->mk_ino_hash_key_initialized); > > > + > > > + ci->ci_hashed_ino = (u32)siphash_1u64(ci->ci_inode->i_ino, > > > + &mk->mk_ino_hash_key); > > > > i_ino is an unsigned long. Will this produce a consistent results on > > arches with 32 and 64 bit long values? I think it'd be nice to ensure > > that we can access an encrypted directory created on a 32-bit host from > > (e.g.) a 64-bit host. > > The result is the same regardless of word size and endianness. > siphash_1u64(v, k) is equivalent to: > > __le64 x = cpu_to_le64(v); > siphash(&x, 8, k); > In the case where you have an (on-storage) inode number that is larger than 2^32, x will almost certainly be different on a 32 vs. 64-bit wordsize. On the box with the 32-bit wordsize, you'll end up promoting i_ino to a 64-bit word and the upper 32 bits will be zeroed out. So it seems like this means that if you're using inline hardware you're going to end up with a result that won't work correctly across different wordsizes. Maybe that's ok, but it seems like something that could be handled by hashing a different value. > > It may be better to base this on something besides i_ino > > This code that hashes the inode number is only used when userspace used > FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32 for the directory. IV_INO_LBLK_32 modifies > the encryption to be optimized for eMMC inline encryption hardware. For more > details, see commit e3b1078bedd3 which added this feature. > > We actually could have hashed the file nonce instead of the inode number. But I > wanted to make the eMMC-optimized format similar to IV_INO_LBLK_64, which is the > format optimized for UFS inline encryption hardware. > > Both of these flags have very specific use cases; they make it feasible to use > inline encryption hardware > (https://www.kernel.org/doc/html/latest/block/inline-encryption.html) > that only supports a small number of keyslots and that limits the IV length. > > You don't need to worry about these flags at all for ceph, since there won't be > any use case to use them on ceph, and ceph won't be declaring support for them. Ahh, good to know. Thanks! -- Jeff Layton <jlayton@xxxxxxxxxx>