2 * linux/fs/ext4/crypto_fname.c
4 * Copyright (C) 2015, Google, Inc.
6 * This contains functions for filename crypto management in ext4
8 * Written by Uday Savagaonkar, 2014.
10 * This has not yet undergone a rigorous security audit.
14 #include <crypto/hash.h>
15 #include <crypto/sha.h>
16 #include <keys/encrypted-type.h>
17 #include <keys/user-type.h>
18 #include <linux/crypto.h>
19 #include <linux/gfp.h>
20 #include <linux/kernel.h>
21 #include <linux/key.h>
22 #include <linux/list.h>
23 #include <linux/mempool.h>
24 #include <linux/random.h>
25 #include <linux/scatterlist.h>
26 #include <linux/spinlock_types.h>
29 #include "ext4_crypto.h"
33 * ext4_dir_crypt_complete() -
35 static void ext4_dir_crypt_complete(struct crypto_async_request
*req
, int res
)
37 struct ext4_completion_result
*ecr
= req
->data
;
39 if (res
== -EINPROGRESS
)
42 complete(&ecr
->completion
);
45 bool ext4_valid_filenames_enc_mode(uint32_t mode
)
47 return (mode
== EXT4_ENCRYPTION_MODE_AES_256_CTS
);
50 static unsigned max_name_len(struct inode
*inode
)
52 return S_ISLNK(inode
->i_mode
) ? inode
->i_sb
->s_blocksize
:
57 * ext4_fname_encrypt() -
59 * This function encrypts the input filename, and returns the length of the
60 * ciphertext. Errors are returned as negative numbers. We trust the caller to
61 * allocate sufficient memory to oname string.
63 static int ext4_fname_encrypt(struct inode
*inode
,
64 const struct qstr
*iname
,
65 struct ext4_str
*oname
)
68 struct ablkcipher_request
*req
= NULL
;
69 DECLARE_EXT4_COMPLETION_RESULT(ecr
);
70 struct ext4_crypt_info
*ci
= EXT4_I(inode
)->i_crypt_info
;
71 struct crypto_ablkcipher
*tfm
= ci
->ci_ctfm
;
73 char iv
[EXT4_CRYPTO_BLOCK_SIZE
];
74 struct scatterlist src_sg
, dst_sg
;
75 int padding
= 4 << (ci
->ci_flags
& EXT4_POLICY_FLAGS_PAD_MASK
);
76 char *workbuf
, buf
[32], *alloc_buf
= NULL
;
77 unsigned lim
= max_name_len(inode
);
79 if (iname
->len
<= 0 || iname
->len
> lim
)
82 ciphertext_len
= (iname
->len
< EXT4_CRYPTO_BLOCK_SIZE
) ?
83 EXT4_CRYPTO_BLOCK_SIZE
: iname
->len
;
84 ciphertext_len
= ext4_fname_crypto_round_up(ciphertext_len
, padding
);
85 ciphertext_len
= (ciphertext_len
> lim
)
86 ? lim
: ciphertext_len
;
88 if (ciphertext_len
<= sizeof(buf
)) {
91 alloc_buf
= kmalloc(ciphertext_len
, GFP_NOFS
);
97 /* Allocate request */
98 req
= ablkcipher_request_alloc(tfm
, GFP_NOFS
);
101 KERN_ERR
"%s: crypto_request_alloc() failed\n", __func__
);
105 ablkcipher_request_set_callback(req
,
106 CRYPTO_TFM_REQ_MAY_BACKLOG
| CRYPTO_TFM_REQ_MAY_SLEEP
,
107 ext4_dir_crypt_complete
, &ecr
);
110 memcpy(workbuf
, iname
->name
, iname
->len
);
111 if (iname
->len
< ciphertext_len
)
112 memset(workbuf
+ iname
->len
, 0, ciphertext_len
- iname
->len
);
115 memset(iv
, 0, EXT4_CRYPTO_BLOCK_SIZE
);
117 /* Create encryption request */
118 sg_init_one(&src_sg
, workbuf
, ciphertext_len
);
119 sg_init_one(&dst_sg
, oname
->name
, ciphertext_len
);
120 ablkcipher_request_set_crypt(req
, &src_sg
, &dst_sg
, ciphertext_len
, iv
);
121 res
= crypto_ablkcipher_encrypt(req
);
122 if (res
== -EINPROGRESS
|| res
== -EBUSY
) {
123 BUG_ON(req
->base
.data
!= &ecr
);
124 wait_for_completion(&ecr
.completion
);
128 ablkcipher_request_free(req
);
131 KERN_ERR
"%s: Error (error code %d)\n", __func__
, res
);
133 oname
->len
= ciphertext_len
;
138 * ext4_fname_decrypt()
139 * This function decrypts the input filename, and returns
140 * the length of the plaintext.
141 * Errors are returned as negative numbers.
142 * We trust the caller to allocate sufficient memory to oname string.
144 static int ext4_fname_decrypt(struct inode
*inode
,
145 const struct ext4_str
*iname
,
146 struct ext4_str
*oname
)
148 struct ext4_str tmp_in
[2], tmp_out
[1];
149 struct ablkcipher_request
*req
= NULL
;
150 DECLARE_EXT4_COMPLETION_RESULT(ecr
);
151 struct scatterlist src_sg
, dst_sg
;
152 struct ext4_crypt_info
*ci
= EXT4_I(inode
)->i_crypt_info
;
153 struct crypto_ablkcipher
*tfm
= ci
->ci_ctfm
;
155 char iv
[EXT4_CRYPTO_BLOCK_SIZE
];
156 unsigned lim
= max_name_len(inode
);
158 if (iname
->len
<= 0 || iname
->len
> lim
)
161 tmp_in
[0].name
= iname
->name
;
162 tmp_in
[0].len
= iname
->len
;
163 tmp_out
[0].name
= oname
->name
;
165 /* Allocate request */
166 req
= ablkcipher_request_alloc(tfm
, GFP_NOFS
);
169 KERN_ERR
"%s: crypto_request_alloc() failed\n", __func__
);
172 ablkcipher_request_set_callback(req
,
173 CRYPTO_TFM_REQ_MAY_BACKLOG
| CRYPTO_TFM_REQ_MAY_SLEEP
,
174 ext4_dir_crypt_complete
, &ecr
);
177 memset(iv
, 0, EXT4_CRYPTO_BLOCK_SIZE
);
179 /* Create encryption request */
180 sg_init_one(&src_sg
, iname
->name
, iname
->len
);
181 sg_init_one(&dst_sg
, oname
->name
, oname
->len
);
182 ablkcipher_request_set_crypt(req
, &src_sg
, &dst_sg
, iname
->len
, iv
);
183 res
= crypto_ablkcipher_decrypt(req
);
184 if (res
== -EINPROGRESS
|| res
== -EBUSY
) {
185 BUG_ON(req
->base
.data
!= &ecr
);
186 wait_for_completion(&ecr
.completion
);
189 ablkcipher_request_free(req
);
192 KERN_ERR
"%s: Error in ext4_fname_encrypt (error code %d)\n",
197 oname
->len
= strnlen(oname
->name
, iname
->len
);
201 static const char *lookup_table
=
202 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,";
205 * ext4_fname_encode_digest() -
207 * Encodes the input digest using characters from the set [a-zA-Z0-9_+].
208 * The encoded string is roughly 4/3 times the size of the input string.
210 static int digest_encode(const char *src
, int len
, char *dst
)
212 int i
= 0, bits
= 0, ac
= 0;
216 ac
+= (((unsigned char) src
[i
]) << bits
);
219 *cp
++ = lookup_table
[ac
& 0x3f];
226 *cp
++ = lookup_table
[ac
& 0x3f];
230 static int digest_decode(const char *src
, int len
, char *dst
)
232 int i
= 0, bits
= 0, ac
= 0;
237 p
= strchr(lookup_table
, src
[i
]);
238 if (p
== NULL
|| src
[i
] == 0)
240 ac
+= (p
- lookup_table
) << bits
;
255 * ext4_fname_crypto_round_up() -
257 * Return: The next multiple of block size
259 u32
ext4_fname_crypto_round_up(u32 size
, u32 blksize
)
261 return ((size
+blksize
-1)/blksize
)*blksize
;
264 unsigned ext4_fname_encrypted_size(struct inode
*inode
, u32 ilen
)
266 struct ext4_crypt_info
*ci
= EXT4_I(inode
)->i_crypt_info
;
270 padding
= 4 << (ci
->ci_flags
& EXT4_POLICY_FLAGS_PAD_MASK
);
271 if (ilen
< EXT4_CRYPTO_BLOCK_SIZE
)
272 ilen
= EXT4_CRYPTO_BLOCK_SIZE
;
273 return ext4_fname_crypto_round_up(ilen
, padding
);
277 * ext4_fname_crypto_alloc_buffer() -
279 * Allocates an output buffer that is sufficient for the crypto operation
280 * specified by the context and the direction.
282 int ext4_fname_crypto_alloc_buffer(struct inode
*inode
,
283 u32 ilen
, struct ext4_str
*crypto_str
)
285 unsigned int olen
= ext4_fname_encrypted_size(inode
, ilen
);
287 crypto_str
->len
= olen
;
288 if (olen
< EXT4_FNAME_CRYPTO_DIGEST_SIZE
*2)
289 olen
= EXT4_FNAME_CRYPTO_DIGEST_SIZE
*2;
290 /* Allocated buffer can hold one more character to null-terminate the
292 crypto_str
->name
= kmalloc(olen
+1, GFP_NOFS
);
293 if (!(crypto_str
->name
))
299 * ext4_fname_crypto_free_buffer() -
301 * Frees the buffer allocated for crypto operation.
303 void ext4_fname_crypto_free_buffer(struct ext4_str
*crypto_str
)
307 kfree(crypto_str
->name
);
308 crypto_str
->name
= NULL
;
312 * ext4_fname_disk_to_usr() - converts a filename from disk space to user space
314 int _ext4_fname_disk_to_usr(struct inode
*inode
,
315 struct dx_hash_info
*hinfo
,
316 const struct ext4_str
*iname
,
317 struct ext4_str
*oname
)
322 if (iname
->len
< 3) {
323 /*Check for . and .. */
324 if (iname
->name
[0] == '.' && iname
->name
[iname
->len
-1] == '.') {
325 oname
->name
[0] = '.';
326 oname
->name
[iname
->len
-1] = '.';
327 oname
->len
= iname
->len
;
331 if (iname
->len
< EXT4_CRYPTO_BLOCK_SIZE
) {
332 EXT4_ERROR_INODE(inode
, "encrypted inode too small");
335 if (EXT4_I(inode
)->i_crypt_info
)
336 return ext4_fname_decrypt(inode
, iname
, oname
);
338 if (iname
->len
<= EXT4_FNAME_CRYPTO_DIGEST_SIZE
) {
339 ret
= digest_encode(iname
->name
, iname
->len
, oname
->name
);
344 memcpy(buf
, &hinfo
->hash
, 4);
345 memcpy(buf
+4, &hinfo
->minor_hash
, 4);
348 memcpy(buf
+ 8, iname
->name
+ iname
->len
- 16, 16);
349 oname
->name
[0] = '_';
350 ret
= digest_encode(buf
, 24, oname
->name
+1);
351 oname
->len
= ret
+ 1;
355 int ext4_fname_disk_to_usr(struct inode
*inode
,
356 struct dx_hash_info
*hinfo
,
357 const struct ext4_dir_entry_2
*de
,
358 struct ext4_str
*oname
)
360 struct ext4_str iname
= {.name
= (unsigned char *) de
->name
,
361 .len
= de
->name_len
};
363 return _ext4_fname_disk_to_usr(inode
, hinfo
, &iname
, oname
);
368 * ext4_fname_usr_to_disk() - converts a filename from user space to disk space
370 int ext4_fname_usr_to_disk(struct inode
*inode
,
371 const struct qstr
*iname
,
372 struct ext4_str
*oname
)
375 struct ext4_crypt_info
*ci
= EXT4_I(inode
)->i_crypt_info
;
377 if (iname
->len
< 3) {
378 /*Check for . and .. */
379 if (iname
->name
[0] == '.' &&
380 iname
->name
[iname
->len
-1] == '.') {
381 oname
->name
[0] = '.';
382 oname
->name
[iname
->len
-1] = '.';
383 oname
->len
= iname
->len
;
388 res
= ext4_fname_encrypt(inode
, iname
, oname
);
391 /* Without a proper key, a user is not allowed to modify the filenames
392 * in a directory. Consequently, a user space name cannot be mapped to
393 * a disk-space name */
397 int ext4_fname_setup_filename(struct inode
*dir
, const struct qstr
*iname
,
398 int lookup
, struct ext4_filename
*fname
)
400 struct ext4_crypt_info
*ci
;
401 int ret
= 0, bigname
= 0;
403 memset(fname
, 0, sizeof(struct ext4_filename
));
404 fname
->usr_fname
= iname
;
406 if (!ext4_encrypted_inode(dir
) ||
407 ((iname
->name
[0] == '.') &&
408 ((iname
->len
== 1) ||
409 ((iname
->name
[1] == '.') && (iname
->len
== 2))))) {
410 fname
->disk_name
.name
= (unsigned char *) iname
->name
;
411 fname
->disk_name
.len
= iname
->len
;
414 ret
= ext4_get_encryption_info(dir
);
417 ci
= EXT4_I(dir
)->i_crypt_info
;
419 ret
= ext4_fname_crypto_alloc_buffer(dir
, iname
->len
,
423 ret
= ext4_fname_encrypt(dir
, iname
, &fname
->crypto_buf
);
426 fname
->disk_name
.name
= fname
->crypto_buf
.name
;
427 fname
->disk_name
.len
= fname
->crypto_buf
.len
;
433 /* We don't have the key and we are doing a lookup; decode the
436 if (iname
->name
[0] == '_')
438 if ((bigname
&& (iname
->len
!= 33)) ||
439 (!bigname
&& (iname
->len
> 43)))
442 fname
->crypto_buf
.name
= kmalloc(32, GFP_KERNEL
);
443 if (fname
->crypto_buf
.name
== NULL
)
445 ret
= digest_decode(iname
->name
+ bigname
, iname
->len
- bigname
,
446 fname
->crypto_buf
.name
);
451 fname
->crypto_buf
.len
= ret
;
453 memcpy(&fname
->hinfo
.hash
, fname
->crypto_buf
.name
, 4);
454 memcpy(&fname
->hinfo
.minor_hash
, fname
->crypto_buf
.name
+ 4, 4);
456 fname
->disk_name
.name
= fname
->crypto_buf
.name
;
457 fname
->disk_name
.len
= fname
->crypto_buf
.len
;
461 kfree(fname
->crypto_buf
.name
);
462 fname
->crypto_buf
.name
= NULL
;
466 void ext4_fname_free_filename(struct ext4_filename
*fname
)
468 kfree(fname
->crypto_buf
.name
);
469 fname
->crypto_buf
.name
= NULL
;
470 fname
->usr_fname
= NULL
;
471 fname
->disk_name
.name
= NULL
;