]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - fs/crypto/crypto.c
fscrypt: add Adiantum support
[zynq/linux.git] / fs / crypto / crypto.c
index 0f46cf550907fcc4a0675b85df9e3331f010e744..4dc788e3bc96b0b5936b9f8df186ef97f1a2cb6c 100644 (file)
@@ -133,15 +133,25 @@ struct fscrypt_ctx *fscrypt_get_ctx(const struct inode *inode, gfp_t gfp_flags)
 }
 EXPORT_SYMBOL(fscrypt_get_ctx);
 
+void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num,
+                        const struct fscrypt_info *ci)
+{
+       memset(iv, 0, ci->ci_mode->ivsize);
+       iv->lblk_num = cpu_to_le64(lblk_num);
+
+       if (ci->ci_flags & FS_POLICY_FLAG_DIRECT_KEY)
+               memcpy(iv->nonce, ci->ci_nonce, FS_KEY_DERIVATION_NONCE_SIZE);
+
+       if (ci->ci_essiv_tfm != NULL)
+               crypto_cipher_encrypt_one(ci->ci_essiv_tfm, iv->raw, iv->raw);
+}
+
 int fscrypt_do_page_crypto(const struct inode *inode, fscrypt_direction_t rw,
                           u64 lblk_num, struct page *src_page,
                           struct page *dest_page, unsigned int len,
                           unsigned int offs, gfp_t gfp_flags)
 {
-       struct {
-               __le64 index;
-               u8 padding[FS_IV_SIZE - sizeof(__le64)];
-       } iv;
+       union fscrypt_iv iv;
        struct skcipher_request *req = NULL;
        DECLARE_CRYPTO_WAIT(wait);
        struct scatterlist dst, src;
@@ -151,15 +161,7 @@ int fscrypt_do_page_crypto(const struct inode *inode, fscrypt_direction_t rw,
 
        BUG_ON(len == 0);
 
-       BUILD_BUG_ON(sizeof(iv) != FS_IV_SIZE);
-       BUILD_BUG_ON(AES_BLOCK_SIZE != FS_IV_SIZE);
-       iv.index = cpu_to_le64(lblk_num);
-       memset(iv.padding, 0, sizeof(iv.padding));
-
-       if (ci->ci_essiv_tfm != NULL) {
-               crypto_cipher_encrypt_one(ci->ci_essiv_tfm, (u8 *)&iv,
-                                         (u8 *)&iv);
-       }
+       fscrypt_generate_iv(&iv, lblk_num, ci);
 
        req = skcipher_request_alloc(tfm, gfp_flags);
        if (!req)