3 static int ubifs_crypt_get_context(struct inode
*inode
, void *ctx
, size_t len
)
5 return ubifs_xattr_get(inode
, UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT
,
9 static int ubifs_crypt_set_context(struct inode
*inode
, const void *ctx
,
10 size_t len
, void *fs_data
)
13 * Creating an encryption context is done unlocked since we
14 * operate on a new inode which is not visible to other users
15 * at this point. So, no need to check whether inode is locked.
17 return ubifs_xattr_set(inode
, UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT
,
21 static bool ubifs_crypt_empty_dir(struct inode
*inode
)
23 return ubifs_check_dir_empty(inode
) == 0;
26 static unsigned int ubifs_crypt_max_namelen(struct inode
*inode
)
28 if (S_ISLNK(inode
->i_mode
))
29 return UBIFS_MAX_INO_DATA
;
31 return UBIFS_MAX_NLEN
;
34 int ubifs_encrypt(const struct inode
*inode
, struct ubifs_data_node
*dn
,
35 unsigned int in_len
, unsigned int *out_len
, int block
)
37 struct ubifs_info
*c
= inode
->i_sb
->s_fs_info
;
40 unsigned int pad_len
= round_up(in_len
, UBIFS_CIPHER_BLOCK_SIZE
);
42 ubifs_assert(pad_len
<= *out_len
);
43 dn
->compr_size
= cpu_to_le16(in_len
);
45 /* pad to full block cipher length */
46 if (pad_len
!= in_len
)
47 memset(p
+ in_len
, 0, pad_len
- in_len
);
49 ret
= fscrypt_encrypt_page(inode
, virt_to_page(&dn
->data
), pad_len
,
50 offset_in_page(&dn
->data
), block
, GFP_NOFS
);
52 ubifs_err(c
, "fscrypt_encrypt_page failed: %ld", PTR_ERR(ret
));
60 int ubifs_decrypt(const struct inode
*inode
, struct ubifs_data_node
*dn
,
61 unsigned int *out_len
, int block
)
63 struct ubifs_info
*c
= inode
->i_sb
->s_fs_info
;
65 unsigned int clen
= le16_to_cpu(dn
->compr_size
);
66 unsigned int dlen
= *out_len
;
68 if (clen
<= 0 || clen
> UBIFS_BLOCK_SIZE
|| clen
> dlen
) {
69 ubifs_err(c
, "bad compr_size: %i", clen
);
73 ubifs_assert(dlen
<= UBIFS_BLOCK_SIZE
);
74 err
= fscrypt_decrypt_page(inode
, virt_to_page(&dn
->data
), dlen
,
75 offset_in_page(&dn
->data
), block
);
77 ubifs_err(c
, "fscrypt_decrypt_page failed: %i", err
);
85 const struct fscrypt_operations ubifs_crypt_operations
= {
86 .flags
= FS_CFLG_OWN_PAGES
,
87 .key_prefix
= "ubifs:",
88 .get_context
= ubifs_crypt_get_context
,
89 .set_context
= ubifs_crypt_set_context
,
90 .is_encrypted
= __ubifs_crypt_is_encrypted
,
91 .empty_dir
= ubifs_crypt_empty_dir
,
92 .max_namelen
= ubifs_crypt_max_namelen
,