2 * This contains functions for filename crypto management
4 * Copyright (C) 2015, Google, Inc.
5 * Copyright (C) 2015, Motorola Mobility
7 * Written by Uday Savagaonkar, 2014.
8 * Modified by Jaegeuk Kim, 2015.
10 * This has not yet undergone a rigorous security audit.
13 #include <linux/scatterlist.h>
14 #include <linux/ratelimit.h>
15 #include "fscrypt_private.h"
18 * fname_crypt_complete() - completion callback for filename crypto
19 * @req: The asynchronous cipher request context
20 * @res: The result of the cipher operation
22 static void fname_crypt_complete(struct crypto_async_request
*req
, int res
)
24 struct fscrypt_completion_result
*ecr
= req
->data
;
26 if (res
== -EINPROGRESS
)
29 complete(&ecr
->completion
);
33 * fname_encrypt() - encrypt a filename
35 * The caller must have allocated sufficient memory for the @oname string.
37 * Return: 0 on success, -errno on failure
39 static int fname_encrypt(struct inode
*inode
,
40 const struct qstr
*iname
, struct fscrypt_str
*oname
)
42 struct skcipher_request
*req
= NULL
;
43 DECLARE_FS_COMPLETION_RESULT(ecr
);
44 struct fscrypt_info
*ci
= inode
->i_crypt_info
;
45 struct crypto_skcipher
*tfm
= ci
->ci_ctfm
;
47 char iv
[FS_CRYPTO_BLOCK_SIZE
];
48 struct scatterlist sg
;
49 int padding
= 4 << (ci
->ci_flags
& FS_POLICY_FLAGS_PAD_MASK
);
51 unsigned int cryptlen
;
53 lim
= inode
->i_sb
->s_cop
->max_namelen(inode
);
54 if (iname
->len
<= 0 || iname
->len
> lim
)
58 * Copy the filename to the output buffer for encrypting in-place and
59 * pad it with the needed number of NUL bytes.
61 cryptlen
= max_t(unsigned int, iname
->len
, FS_CRYPTO_BLOCK_SIZE
);
62 cryptlen
= round_up(cryptlen
, padding
);
63 cryptlen
= min(cryptlen
, lim
);
64 memcpy(oname
->name
, iname
->name
, iname
->len
);
65 memset(oname
->name
+ iname
->len
, 0, cryptlen
- iname
->len
);
67 /* Initialize the IV */
68 memset(iv
, 0, FS_CRYPTO_BLOCK_SIZE
);
70 /* Set up the encryption request */
71 req
= skcipher_request_alloc(tfm
, GFP_NOFS
);
73 printk_ratelimited(KERN_ERR
74 "%s: skcipher_request_alloc() failed\n", __func__
);
77 skcipher_request_set_callback(req
,
78 CRYPTO_TFM_REQ_MAY_BACKLOG
| CRYPTO_TFM_REQ_MAY_SLEEP
,
79 fname_crypt_complete
, &ecr
);
80 sg_init_one(&sg
, oname
->name
, cryptlen
);
81 skcipher_request_set_crypt(req
, &sg
, &sg
, cryptlen
, iv
);
83 /* Do the encryption */
84 res
= crypto_skcipher_encrypt(req
);
85 if (res
== -EINPROGRESS
|| res
== -EBUSY
) {
86 /* Request is being completed asynchronously; wait for it */
87 wait_for_completion(&ecr
.completion
);
90 skcipher_request_free(req
);
92 printk_ratelimited(KERN_ERR
93 "%s: Error (error code %d)\n", __func__
, res
);
97 oname
->len
= cryptlen
;
102 * fname_decrypt() - decrypt a filename
104 * The caller must have allocated sufficient memory for the @oname string.
106 * Return: 0 on success, -errno on failure
108 static int fname_decrypt(struct inode
*inode
,
109 const struct fscrypt_str
*iname
,
110 struct fscrypt_str
*oname
)
112 struct skcipher_request
*req
= NULL
;
113 DECLARE_FS_COMPLETION_RESULT(ecr
);
114 struct scatterlist src_sg
, dst_sg
;
115 struct fscrypt_info
*ci
= inode
->i_crypt_info
;
116 struct crypto_skcipher
*tfm
= ci
->ci_ctfm
;
118 char iv
[FS_CRYPTO_BLOCK_SIZE
];
121 lim
= inode
->i_sb
->s_cop
->max_namelen(inode
);
122 if (iname
->len
<= 0 || iname
->len
> lim
)
125 /* Allocate request */
126 req
= skcipher_request_alloc(tfm
, GFP_NOFS
);
128 printk_ratelimited(KERN_ERR
129 "%s: crypto_request_alloc() failed\n", __func__
);
132 skcipher_request_set_callback(req
,
133 CRYPTO_TFM_REQ_MAY_BACKLOG
| CRYPTO_TFM_REQ_MAY_SLEEP
,
134 fname_crypt_complete
, &ecr
);
137 memset(iv
, 0, FS_CRYPTO_BLOCK_SIZE
);
139 /* Create decryption request */
140 sg_init_one(&src_sg
, iname
->name
, iname
->len
);
141 sg_init_one(&dst_sg
, oname
->name
, oname
->len
);
142 skcipher_request_set_crypt(req
, &src_sg
, &dst_sg
, iname
->len
, iv
);
143 res
= crypto_skcipher_decrypt(req
);
144 if (res
== -EINPROGRESS
|| res
== -EBUSY
) {
145 wait_for_completion(&ecr
.completion
);
148 skcipher_request_free(req
);
150 printk_ratelimited(KERN_ERR
151 "%s: Error (error code %d)\n", __func__
, res
);
155 oname
->len
= strnlen(oname
->name
, iname
->len
);
159 static const char *lookup_table
=
160 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,";
165 * Encodes the input digest using characters from the set [a-zA-Z0-9_+].
166 * The encoded string is roughly 4/3 times the size of the input string.
168 static int digest_encode(const char *src
, int len
, char *dst
)
170 int i
= 0, bits
= 0, ac
= 0;
174 ac
+= (((unsigned char) src
[i
]) << bits
);
177 *cp
++ = lookup_table
[ac
& 0x3f];
184 *cp
++ = lookup_table
[ac
& 0x3f];
188 static int digest_decode(const char *src
, int len
, char *dst
)
190 int i
= 0, bits
= 0, ac
= 0;
195 p
= strchr(lookup_table
, src
[i
]);
196 if (p
== NULL
|| src
[i
] == 0)
198 ac
+= (p
- lookup_table
) << bits
;
212 u32
fscrypt_fname_encrypted_size(const struct inode
*inode
, u32 ilen
)
215 struct fscrypt_info
*ci
= inode
->i_crypt_info
;
218 padding
= 4 << (ci
->ci_flags
& FS_POLICY_FLAGS_PAD_MASK
);
219 ilen
= max(ilen
, (u32
)FS_CRYPTO_BLOCK_SIZE
);
220 return round_up(ilen
, padding
);
222 EXPORT_SYMBOL(fscrypt_fname_encrypted_size
);
225 * fscrypt_fname_crypto_alloc_obuff() -
227 * Allocates an output buffer that is sufficient for the crypto operation
228 * specified by the context and the direction.
230 int fscrypt_fname_alloc_buffer(const struct inode
*inode
,
231 u32 ilen
, struct fscrypt_str
*crypto_str
)
233 unsigned int olen
= fscrypt_fname_encrypted_size(inode
, ilen
);
235 crypto_str
->len
= olen
;
236 if (olen
< FS_FNAME_CRYPTO_DIGEST_SIZE
* 2)
237 olen
= FS_FNAME_CRYPTO_DIGEST_SIZE
* 2;
239 * Allocated buffer can hold one more character to null-terminate the
242 crypto_str
->name
= kmalloc(olen
+ 1, GFP_NOFS
);
243 if (!(crypto_str
->name
))
247 EXPORT_SYMBOL(fscrypt_fname_alloc_buffer
);
250 * fscrypt_fname_crypto_free_buffer() -
252 * Frees the buffer allocated for crypto operation.
254 void fscrypt_fname_free_buffer(struct fscrypt_str
*crypto_str
)
258 kfree(crypto_str
->name
);
259 crypto_str
->name
= NULL
;
261 EXPORT_SYMBOL(fscrypt_fname_free_buffer
);
264 * fscrypt_fname_disk_to_usr() - converts a filename from disk space to user
267 * The caller must have allocated sufficient memory for the @oname string.
269 * Return: 0 on success, -errno on failure
271 int fscrypt_fname_disk_to_usr(struct inode
*inode
,
272 u32 hash
, u32 minor_hash
,
273 const struct fscrypt_str
*iname
,
274 struct fscrypt_str
*oname
)
276 const struct qstr qname
= FSTR_TO_QSTR(iname
);
279 if (fscrypt_is_dot_dotdot(&qname
)) {
280 oname
->name
[0] = '.';
281 oname
->name
[iname
->len
- 1] = '.';
282 oname
->len
= iname
->len
;
286 if (iname
->len
< FS_CRYPTO_BLOCK_SIZE
)
289 if (inode
->i_crypt_info
)
290 return fname_decrypt(inode
, iname
, oname
);
292 if (iname
->len
<= FS_FNAME_CRYPTO_DIGEST_SIZE
) {
293 oname
->len
= digest_encode(iname
->name
, iname
->len
,
298 memcpy(buf
, &hash
, 4);
299 memcpy(buf
+ 4, &minor_hash
, 4);
303 memcpy(buf
+ 8, iname
->name
+ iname
->len
- 16, 16);
304 oname
->name
[0] = '_';
305 oname
->len
= 1 + digest_encode(buf
, 24, oname
->name
+ 1);
308 EXPORT_SYMBOL(fscrypt_fname_disk_to_usr
);
311 * fscrypt_fname_usr_to_disk() - converts a filename from user space to disk
314 * The caller must have allocated sufficient memory for the @oname string.
316 * Return: 0 on success, -errno on failure
318 int fscrypt_fname_usr_to_disk(struct inode
*inode
,
319 const struct qstr
*iname
,
320 struct fscrypt_str
*oname
)
322 if (fscrypt_is_dot_dotdot(iname
)) {
323 oname
->name
[0] = '.';
324 oname
->name
[iname
->len
- 1] = '.';
325 oname
->len
= iname
->len
;
328 if (inode
->i_crypt_info
)
329 return fname_encrypt(inode
, iname
, oname
);
331 * Without a proper key, a user is not allowed to modify the filenames
332 * in a directory. Consequently, a user space name cannot be mapped to
337 EXPORT_SYMBOL(fscrypt_fname_usr_to_disk
);
339 int fscrypt_setup_filename(struct inode
*dir
, const struct qstr
*iname
,
340 int lookup
, struct fscrypt_name
*fname
)
342 int ret
= 0, bigname
= 0;
344 memset(fname
, 0, sizeof(struct fscrypt_name
));
345 fname
->usr_fname
= iname
;
347 if (!dir
->i_sb
->s_cop
->is_encrypted(dir
) ||
348 fscrypt_is_dot_dotdot(iname
)) {
349 fname
->disk_name
.name
= (unsigned char *)iname
->name
;
350 fname
->disk_name
.len
= iname
->len
;
353 ret
= fscrypt_get_crypt_info(dir
);
354 if (ret
&& ret
!= -EOPNOTSUPP
)
357 if (dir
->i_crypt_info
) {
358 ret
= fscrypt_fname_alloc_buffer(dir
, iname
->len
,
362 ret
= fname_encrypt(dir
, iname
, &fname
->crypto_buf
);
365 fname
->disk_name
.name
= fname
->crypto_buf
.name
;
366 fname
->disk_name
.len
= fname
->crypto_buf
.len
;
373 * We don't have the key and we are doing a lookup; decode the
376 if (iname
->name
[0] == '_')
378 if ((bigname
&& (iname
->len
!= 33)) || (!bigname
&& (iname
->len
> 43)))
381 fname
->crypto_buf
.name
= kmalloc(32, GFP_KERNEL
);
382 if (fname
->crypto_buf
.name
== NULL
)
385 ret
= digest_decode(iname
->name
+ bigname
, iname
->len
- bigname
,
386 fname
->crypto_buf
.name
);
391 fname
->crypto_buf
.len
= ret
;
393 memcpy(&fname
->hash
, fname
->crypto_buf
.name
, 4);
394 memcpy(&fname
->minor_hash
, fname
->crypto_buf
.name
+ 4, 4);
396 fname
->disk_name
.name
= fname
->crypto_buf
.name
;
397 fname
->disk_name
.len
= fname
->crypto_buf
.len
;
402 fscrypt_fname_free_buffer(&fname
->crypto_buf
);
405 EXPORT_SYMBOL(fscrypt_setup_filename
);
407 void fscrypt_free_filename(struct fscrypt_name
*fname
)
409 kfree(fname
->crypto_buf
.name
);
410 fname
->crypto_buf
.name
= NULL
;
411 fname
->usr_fname
= NULL
;
412 fname
->disk_name
.name
= NULL
;
414 EXPORT_SYMBOL(fscrypt_free_filename
);