fname.c 11.1 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
 * This contains functions for filename crypto management
4 5 6 7 8
 *
 * Copyright (C) 2015, Google, Inc.
 * Copyright (C) 2015, Motorola Mobility
 *
 * Written by Uday Savagaonkar, 2014.
9
 * Modified by Jaegeuk Kim, 2015.
10 11 12
 *
 * This has not yet undergone a rigorous security audit.
 */
13

14 15
#include <linux/scatterlist.h>
#include <linux/ratelimit.h>
16
#include <crypto/skcipher.h>
17
#include "fscrypt_private.h"
18

19 20 21 22 23 24 25 26 27 28 29
static inline bool fscrypt_is_dot_dotdot(const struct qstr *str)
{
	if (str->len == 1 && str->name[0] == '.')
		return true;

	if (str->len == 2 && str->name[0] == '.' && str->name[1] == '.')
		return true;

	return false;
}

30
/**
31
 * fname_encrypt() - encrypt a filename
32
 *
33 34
 * The output buffer must be at least as large as the input buffer.
 * Any extra space is filled with NUL padding before encryption.
35 36
 *
 * Return: 0 on success, -errno on failure
37
 */
38 39
int fname_encrypt(struct inode *inode, const struct qstr *iname,
		  u8 *out, unsigned int olen)
40
{
H
Herbert Xu 已提交
41
	struct skcipher_request *req = NULL;
42
	DECLARE_CRYPTO_WAIT(wait);
43
	struct crypto_skcipher *tfm = inode->i_crypt_info->ci_ctfm;
44
	int res = 0;
45
	char iv[FS_CRYPTO_BLOCK_SIZE];
46
	struct scatterlist sg;
47

48 49 50 51
	/*
	 * Copy the filename to the output buffer for encrypting in-place and
	 * pad it with the needed number of NUL bytes.
	 */
52
	if (WARN_ON(olen < iname->len))
53
		return -ENOBUFS;
54 55
	memcpy(out, iname->name, iname->len);
	memset(out + iname->len, 0, olen - iname->len);
56

57 58
	/* Initialize the IV */
	memset(iv, 0, FS_CRYPTO_BLOCK_SIZE);
59

60
	/* Set up the encryption request */
H
Herbert Xu 已提交
61
	req = skcipher_request_alloc(tfm, GFP_NOFS);
62 63
	if (!req) {
		printk_ratelimited(KERN_ERR
64
			"%s: skcipher_request_alloc() failed\n", __func__);
65 66
		return -ENOMEM;
	}
H
Herbert Xu 已提交
67
	skcipher_request_set_callback(req,
68
			CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
69
			crypto_req_done, &wait);
70 71
	sg_init_one(&sg, out, olen);
	skcipher_request_set_crypt(req, &sg, &sg, olen, iv);
72

73
	/* Do the encryption */
74
	res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
H
Herbert Xu 已提交
75
	skcipher_request_free(req);
76
	if (res < 0) {
77 78
		printk_ratelimited(KERN_ERR
				"%s: Error (error code %d)\n", __func__, res);
79 80
		return res;
	}
81

82
	return 0;
83 84
}

85 86 87 88 89 90
/**
 * fname_decrypt() - decrypt a filename
 *
 * The caller must have allocated sufficient memory for the @oname string.
 *
 * Return: 0 on success, -errno on failure
91
 */
92 93 94
static int fname_decrypt(struct inode *inode,
				const struct fscrypt_str *iname,
				struct fscrypt_str *oname)
95
{
H
Herbert Xu 已提交
96
	struct skcipher_request *req = NULL;
97
	DECLARE_CRYPTO_WAIT(wait);
98
	struct scatterlist src_sg, dst_sg;
99
	struct fscrypt_info *ci = inode->i_crypt_info;
H
Herbert Xu 已提交
100
	struct crypto_skcipher *tfm = ci->ci_ctfm;
101
	int res = 0;
102 103
	char iv[FS_CRYPTO_BLOCK_SIZE];
	unsigned lim;
104

105
	lim = inode->i_sb->s_cop->max_namelen(inode);
106 107 108 109
	if (iname->len <= 0 || iname->len > lim)
		return -EIO;

	/* Allocate request */
H
Herbert Xu 已提交
110
	req = skcipher_request_alloc(tfm, GFP_NOFS);
111 112 113 114 115
	if (!req) {
		printk_ratelimited(KERN_ERR
			"%s: crypto_request_alloc() failed\n",  __func__);
		return -ENOMEM;
	}
H
Herbert Xu 已提交
116
	skcipher_request_set_callback(req,
117
		CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
118
		crypto_req_done, &wait);
119 120

	/* Initialize IV */
121
	memset(iv, 0, FS_CRYPTO_BLOCK_SIZE);
122 123 124 125

	/* Create decryption request */
	sg_init_one(&src_sg, iname->name, iname->len);
	sg_init_one(&dst_sg, oname->name, oname->len);
H
Herbert Xu 已提交
126
	skcipher_request_set_crypt(req, &src_sg, &dst_sg, iname->len, iv);
127
	res = crypto_wait_req(crypto_skcipher_decrypt(req), &wait);
H
Herbert Xu 已提交
128
	skcipher_request_free(req);
129 130
	if (res < 0) {
		printk_ratelimited(KERN_ERR
131
				"%s: Error (error code %d)\n", __func__, res);
132 133 134 135
		return res;
	}

	oname->len = strnlen(oname->name, iname->len);
136
	return 0;
137 138 139 140 141
}

static const char *lookup_table =
	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,";

142 143
#define BASE64_CHARS(nbytes)	DIV_ROUND_UP((nbytes) * 4, 3)

144
/**
145
 * digest_encode() -
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
 *
 * Encodes the input digest using characters from the set [a-zA-Z0-9_+].
 * The encoded string is roughly 4/3 times the size of the input string.
 */
static int digest_encode(const char *src, int len, char *dst)
{
	int i = 0, bits = 0, ac = 0;
	char *cp = dst;

	while (i < len) {
		ac += (((unsigned char) src[i]) << bits);
		bits += 8;
		do {
			*cp++ = lookup_table[ac & 0x3f];
			ac >>= 6;
			bits -= 6;
		} while (bits >= 6);
		i++;
	}
	if (bits)
		*cp++ = lookup_table[ac & 0x3f];
	return cp - dst;
}

static int digest_decode(const char *src, int len, char *dst)
{
	int i = 0, bits = 0, ac = 0;
	const char *p;
	char *cp = dst;

	while (i < len) {
		p = strchr(lookup_table, src[i]);
		if (p == NULL || src[i] == 0)
			return -2;
		ac += (p - lookup_table) << bits;
		bits += 6;
		if (bits >= 8) {
			*cp++ = ac & 0xff;
			ac >>= 8;
			bits -= 8;
		}
		i++;
	}
	if (ac)
		return -1;
	return cp - dst;
}

194
u32 fscrypt_fname_encrypted_size(const struct inode *inode, u32 ilen)
195
{
196
	int padding = 32;
197
	struct fscrypt_info *ci = inode->i_crypt_info;
198 199

	if (ci)
200
		padding = 4 << (ci->ci_flags & FS_POLICY_FLAGS_PAD_MASK);
201 202
	ilen = max(ilen, (u32)FS_CRYPTO_BLOCK_SIZE);
	return round_up(ilen, padding);
203
}
204
EXPORT_SYMBOL(fscrypt_fname_encrypted_size);
205 206

/**
207
 * fscrypt_fname_alloc_buffer - allocate a buffer for presented filenames
208
 *
209 210 211 212
 * Allocate a buffer that is large enough to hold any decrypted or encoded
 * filename (null-terminated), for the given maximum encrypted filename length.
 *
 * Return: 0 on success, -errno on failure
213
 */
214
int fscrypt_fname_alloc_buffer(const struct inode *inode,
215 216
			       u32 max_encrypted_len,
			       struct fscrypt_str *crypto_str)
217
{
218 219 220
	const u32 max_encoded_len =
		max_t(u32, BASE64_CHARS(FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE),
		      1 + BASE64_CHARS(sizeof(struct fscrypt_digested_name)));
221
	u32 max_presented_len;
222

223
	max_presented_len = max(max_encoded_len, max_encrypted_len);
224

225 226
	crypto_str->name = kmalloc(max_presented_len + 1, GFP_NOFS);
	if (!crypto_str->name)
227
		return -ENOMEM;
228
	crypto_str->len = max_presented_len;
229 230
	return 0;
}
231
EXPORT_SYMBOL(fscrypt_fname_alloc_buffer);
232 233

/**
234
 * fscrypt_fname_free_buffer - free the buffer for presented filenames
235
 *
236
 * Free the buffer allocated by fscrypt_fname_alloc_buffer().
237
 */
238
void fscrypt_fname_free_buffer(struct fscrypt_str *crypto_str)
239 240 241 242 243 244
{
	if (!crypto_str)
		return;
	kfree(crypto_str->name);
	crypto_str->name = NULL;
}
245
EXPORT_SYMBOL(fscrypt_fname_free_buffer);
246 247

/**
248 249
 * fscrypt_fname_disk_to_usr() - converts a filename from disk space to user
 * space
250 251 252
 *
 * The caller must have allocated sufficient memory for the @oname string.
 *
253 254 255 256
 * If the key is available, we'll decrypt the disk name; otherwise, we'll encode
 * it for presentation.  Short names are directly base64-encoded, while long
 * names are encoded in fscrypt_digested_name format.
 *
257
 * Return: 0 on success, -errno on failure
258
 */
259 260 261 262
int fscrypt_fname_disk_to_usr(struct inode *inode,
			u32 hash, u32 minor_hash,
			const struct fscrypt_str *iname,
			struct fscrypt_str *oname)
263 264
{
	const struct qstr qname = FSTR_TO_QSTR(iname);
265
	struct fscrypt_digested_name digested_name;
266

267
	if (fscrypt_is_dot_dotdot(&qname)) {
268 269 270
		oname->name[0] = '.';
		oname->name[iname->len - 1] = '.';
		oname->len = iname->len;
271
		return 0;
272 273
	}

274
	if (iname->len < FS_CRYPTO_BLOCK_SIZE)
275
		return -EUCLEAN;
276

277 278 279
	if (inode->i_crypt_info)
		return fname_decrypt(inode, iname, oname);

280
	if (iname->len <= FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE) {
281 282 283
		oname->len = digest_encode(iname->name, iname->len,
					   oname->name);
		return 0;
284 285
	}
	if (hash) {
286 287
		digested_name.hash = hash;
		digested_name.minor_hash = minor_hash;
288
	} else {
289 290
		digested_name.hash = 0;
		digested_name.minor_hash = 0;
291
	}
292 293 294
	memcpy(digested_name.digest,
	       FSCRYPT_FNAME_DIGEST(iname->name, iname->len),
	       FSCRYPT_FNAME_DIGEST_SIZE);
295
	oname->name[0] = '_';
296 297
	oname->len = 1 + digest_encode((const char *)&digested_name,
				       sizeof(digested_name), oname->name + 1);
298
	return 0;
299
}
300
EXPORT_SYMBOL(fscrypt_fname_disk_to_usr);
301

302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
/**
 * fscrypt_setup_filename() - prepare to search a possibly encrypted directory
 * @dir: the directory that will be searched
 * @iname: the user-provided filename being searched for
 * @lookup: 1 if we're allowed to proceed without the key because it's
 *	->lookup() or we're finding the dir_entry for deletion; 0 if we cannot
 *	proceed without the key because we're going to create the dir_entry.
 * @fname: the filename information to be filled in
 *
 * Given a user-provided filename @iname, this function sets @fname->disk_name
 * to the name that would be stored in the on-disk directory entry, if possible.
 * If the directory is unencrypted this is simply @iname.  Else, if we have the
 * directory's encryption key, then @iname is the plaintext, so we encrypt it to
 * get the disk_name.
 *
 * Else, for keyless @lookup operations, @iname is the presented ciphertext, so
 * we decode it to get either the ciphertext disk_name (for short names) or the
 * fscrypt_digested_name (for long names).  Non-@lookup operations will be
 * impossible in this case, so we fail them with ENOKEY.
 *
 * If successful, fscrypt_free_filename() must be called later to clean up.
 *
 * Return: 0 on success, -errno on failure
 */
326 327
int fscrypt_setup_filename(struct inode *dir, const struct qstr *iname,
			      int lookup, struct fscrypt_name *fname)
328
{
329 330
	int ret;
	int digested;
331

332
	memset(fname, 0, sizeof(struct fscrypt_name));
333 334
	fname->usr_fname = iname;

335
	if (!IS_ENCRYPTED(dir) || fscrypt_is_dot_dotdot(iname)) {
336 337
		fname->disk_name.name = (unsigned char *)iname->name;
		fname->disk_name.len = iname->len;
338
		return 0;
339
	}
340
	ret = fscrypt_get_encryption_info(dir);
341
	if (ret && ret != -EOPNOTSUPP)
342
		return ret;
343 344

	if (dir->i_crypt_info) {
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359
		unsigned int max_len = dir->i_sb->s_cop->max_namelen(dir);

		if (iname->len > max_len)
			return -ENAMETOOLONG;

		fname->crypto_buf.len =
			min(fscrypt_fname_encrypted_size(dir, iname->len),
			    max_len);
		fname->crypto_buf.name = kmalloc(fname->crypto_buf.len,
						 GFP_NOFS);
		if (!fname->crypto_buf.name)
			return -ENOMEM;

		ret = fname_encrypt(dir, iname, fname->crypto_buf.name,
				    fname->crypto_buf.len);
360
		if (ret)
361
			goto errout;
362 363
		fname->disk_name.name = fname->crypto_buf.name;
		fname->disk_name.len = fname->crypto_buf.len;
364
		return 0;
365
	}
366
	if (!lookup)
367
		return -ENOKEY;
368

369 370
	/*
	 * We don't have the key and we are doing a lookup; decode the
371 372
	 * user-supplied name
	 */
373 374 375 376 377 378 379 380 381 382 383
	if (iname->name[0] == '_') {
		if (iname->len !=
		    1 + BASE64_CHARS(sizeof(struct fscrypt_digested_name)))
			return -ENOENT;
		digested = 1;
	} else {
		if (iname->len >
		    BASE64_CHARS(FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE))
			return -ENOENT;
		digested = 0;
	}
384

385 386 387 388
	fname->crypto_buf.name =
		kmalloc(max_t(size_t, FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE,
			      sizeof(struct fscrypt_digested_name)),
			GFP_KERNEL);
389 390
	if (fname->crypto_buf.name == NULL)
		return -ENOMEM;
391

392
	ret = digest_decode(iname->name + digested, iname->len - digested,
393 394 395
				fname->crypto_buf.name);
	if (ret < 0) {
		ret = -ENOENT;
396
		goto errout;
397 398
	}
	fname->crypto_buf.len = ret;
399 400 401 402 403
	if (digested) {
		const struct fscrypt_digested_name *n =
			(const void *)fname->crypto_buf.name;
		fname->hash = n->hash;
		fname->minor_hash = n->minor_hash;
404 405 406 407
	} else {
		fname->disk_name.name = fname->crypto_buf.name;
		fname->disk_name.len = fname->crypto_buf.len;
	}
408
	return 0;
409

410
errout:
411
	kfree(fname->crypto_buf.name);
412 413
	return ret;
}
414
EXPORT_SYMBOL(fscrypt_setup_filename);