xref: /linux/fs/ubifs/crypto.c (revision 182c2909e22d8a3ec39f8a4530fa19867cbd989b)
1 #include "ubifs.h"
2 
3 static int ubifs_crypt_get_context(struct inode *inode, void *ctx, size_t len)
4 {
5 	return ubifs_xattr_get(inode, UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT,
6 			       ctx, len);
7 }
8 
9 static int ubifs_crypt_set_context(struct inode *inode, const void *ctx,
10 				   size_t len, void *fs_data)
11 {
12 	return ubifs_xattr_set(inode, UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT,
13 			       ctx, len, 0);
14 }
15 
16 static bool ubifs_crypt_empty_dir(struct inode *inode)
17 {
18 	return ubifs_check_dir_empty(inode) == 0;
19 }
20 
21 static unsigned int ubifs_crypt_max_namelen(struct inode *inode)
22 {
23 	if (S_ISLNK(inode->i_mode))
24 		return UBIFS_MAX_INO_DATA;
25 	else
26 		return UBIFS_MAX_NLEN;
27 }
28 
29 static int ubifs_key_prefix(struct inode *inode, u8 **key)
30 {
31 	static char prefix[] = "ubifs:";
32 
33 	*key = prefix;
34 
35 	return sizeof(prefix) - 1;
36 }
37 
38 int ubifs_encrypt(const struct inode *inode, struct ubifs_data_node *dn,
39 		  unsigned int in_len, unsigned int *out_len, int block)
40 {
41 	struct ubifs_info *c = inode->i_sb->s_fs_info;
42 	void *p = &dn->data;
43 	struct page *ret;
44 	unsigned int pad_len = round_up(in_len, UBIFS_CIPHER_BLOCK_SIZE);
45 
46 	ubifs_assert(pad_len <= *out_len);
47 	dn->compr_size = cpu_to_le16(in_len);
48 
49 	/* pad to full block cipher length */
50 	if (pad_len != in_len)
51 		memset(p + in_len, 0, pad_len - in_len);
52 
53 	ret = fscrypt_encrypt_page(inode, virt_to_page(&dn->data), pad_len,
54 			offset_in_page(&dn->data), block, GFP_NOFS);
55 	if (IS_ERR(ret)) {
56 		ubifs_err(c, "fscrypt_encrypt_page failed: %ld", PTR_ERR(ret));
57 		return PTR_ERR(ret);
58 	}
59 	*out_len = pad_len;
60 
61 	return 0;
62 }
63 
64 int ubifs_decrypt(const struct inode *inode, struct ubifs_data_node *dn,
65 		  unsigned int *out_len, int block)
66 {
67 	struct ubifs_info *c = inode->i_sb->s_fs_info;
68 	int err;
69 	unsigned int clen = le16_to_cpu(dn->compr_size);
70 	unsigned int dlen = *out_len;
71 
72 	if (clen <= 0 || clen > UBIFS_BLOCK_SIZE || clen > dlen) {
73 		ubifs_err(c, "bad compr_size: %i", clen);
74 		return -EINVAL;
75 	}
76 
77 	ubifs_assert(dlen <= UBIFS_BLOCK_SIZE);
78 	err = fscrypt_decrypt_page(inode, virt_to_page(&dn->data), dlen,
79 			offset_in_page(&dn->data), block);
80 	if (err) {
81 		ubifs_err(c, "fscrypt_decrypt_page failed: %i", err);
82 		return err;
83 	}
84 	*out_len = clen;
85 
86 	return 0;
87 }
88 
89 struct fscrypt_operations ubifs_crypt_operations = {
90 	.flags			= FS_CFLG_OWN_PAGES,
91 	.get_context		= ubifs_crypt_get_context,
92 	.set_context		= ubifs_crypt_set_context,
93 	.is_encrypted		= __ubifs_crypt_is_encrypted,
94 	.empty_dir		= ubifs_crypt_empty_dir,
95 	.max_namelen		= ubifs_crypt_max_namelen,
96 	.key_prefix		= ubifs_key_prefix,
97 };
98