0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <linux/namei.h>
0015 #include <linux/scatterlist.h>
0016 #include <crypto/hash.h>
0017 #include <crypto/sha2.h>
0018 #include <crypto/skcipher.h>
0019 #include "fscrypt_private.h"
0020
0021
0022
0023
0024
0025
0026 #define FSCRYPT_FNAME_MIN_MSG_LEN 16
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 struct fscrypt_nokey_name {
0059 u32 dirhash[2];
0060 u8 bytes[149];
0061 u8 sha256[SHA256_DIGEST_SIZE];
0062 };
0063
0064
0065
0066
0067
0068
0069 #define FSCRYPT_NOKEY_NAME_MAX offsetofend(struct fscrypt_nokey_name, sha256)
0070
0071
0072 #define FSCRYPT_NOKEY_NAME_MAX_ENCODED \
0073 FSCRYPT_BASE64URL_CHARS(FSCRYPT_NOKEY_NAME_MAX)
0074
0075 static inline bool fscrypt_is_dot_dotdot(const struct qstr *str)
0076 {
0077 if (str->len == 1 && str->name[0] == '.')
0078 return true;
0079
0080 if (str->len == 2 && str->name[0] == '.' && str->name[1] == '.')
0081 return true;
0082
0083 return false;
0084 }
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098 int fscrypt_fname_encrypt(const struct inode *inode, const struct qstr *iname,
0099 u8 *out, unsigned int olen)
0100 {
0101 struct skcipher_request *req = NULL;
0102 DECLARE_CRYPTO_WAIT(wait);
0103 const struct fscrypt_info *ci = inode->i_crypt_info;
0104 struct crypto_skcipher *tfm = ci->ci_enc_key.tfm;
0105 union fscrypt_iv iv;
0106 struct scatterlist sg;
0107 int res;
0108
0109
0110
0111
0112
0113 if (WARN_ON(olen < iname->len))
0114 return -ENOBUFS;
0115 memcpy(out, iname->name, iname->len);
0116 memset(out + iname->len, 0, olen - iname->len);
0117
0118
0119 fscrypt_generate_iv(&iv, 0, ci);
0120
0121
0122 req = skcipher_request_alloc(tfm, GFP_NOFS);
0123 if (!req)
0124 return -ENOMEM;
0125 skcipher_request_set_callback(req,
0126 CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
0127 crypto_req_done, &wait);
0128 sg_init_one(&sg, out, olen);
0129 skcipher_request_set_crypt(req, &sg, &sg, olen, &iv);
0130
0131
0132 res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
0133 skcipher_request_free(req);
0134 if (res < 0) {
0135 fscrypt_err(inode, "Filename encryption failed: %d", res);
0136 return res;
0137 }
0138
0139 return 0;
0140 }
0141 EXPORT_SYMBOL_GPL(fscrypt_fname_encrypt);
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153 static int fname_decrypt(const struct inode *inode,
0154 const struct fscrypt_str *iname,
0155 struct fscrypt_str *oname)
0156 {
0157 struct skcipher_request *req = NULL;
0158 DECLARE_CRYPTO_WAIT(wait);
0159 struct scatterlist src_sg, dst_sg;
0160 const struct fscrypt_info *ci = inode->i_crypt_info;
0161 struct crypto_skcipher *tfm = ci->ci_enc_key.tfm;
0162 union fscrypt_iv iv;
0163 int res;
0164
0165
0166 req = skcipher_request_alloc(tfm, GFP_NOFS);
0167 if (!req)
0168 return -ENOMEM;
0169 skcipher_request_set_callback(req,
0170 CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
0171 crypto_req_done, &wait);
0172
0173
0174 fscrypt_generate_iv(&iv, 0, ci);
0175
0176
0177 sg_init_one(&src_sg, iname->name, iname->len);
0178 sg_init_one(&dst_sg, oname->name, oname->len);
0179 skcipher_request_set_crypt(req, &src_sg, &dst_sg, iname->len, &iv);
0180 res = crypto_wait_req(crypto_skcipher_decrypt(req), &wait);
0181 skcipher_request_free(req);
0182 if (res < 0) {
0183 fscrypt_err(inode, "Filename decryption failed: %d", res);
0184 return res;
0185 }
0186
0187 oname->len = strnlen(oname->name, iname->len);
0188 return 0;
0189 }
0190
0191 static const char base64url_table[65] =
0192 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
0193
0194 #define FSCRYPT_BASE64URL_CHARS(nbytes) DIV_ROUND_UP((nbytes) * 4, 3)
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210 static int fscrypt_base64url_encode(const u8 *src, int srclen, char *dst)
0211 {
0212 u32 ac = 0;
0213 int bits = 0;
0214 int i;
0215 char *cp = dst;
0216
0217 for (i = 0; i < srclen; i++) {
0218 ac = (ac << 8) | src[i];
0219 bits += 8;
0220 do {
0221 bits -= 6;
0222 *cp++ = base64url_table[(ac >> bits) & 0x3f];
0223 } while (bits >= 6);
0224 }
0225 if (bits)
0226 *cp++ = base64url_table[(ac << (6 - bits)) & 0x3f];
0227 return cp - dst;
0228 }
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245 static int fscrypt_base64url_decode(const char *src, int srclen, u8 *dst)
0246 {
0247 u32 ac = 0;
0248 int bits = 0;
0249 int i;
0250 u8 *bp = dst;
0251
0252 for (i = 0; i < srclen; i++) {
0253 const char *p = strchr(base64url_table, src[i]);
0254
0255 if (p == NULL || src[i] == 0)
0256 return -1;
0257 ac = (ac << 6) | (p - base64url_table);
0258 bits += 6;
0259 if (bits >= 8) {
0260 bits -= 8;
0261 *bp++ = (u8)(ac >> bits);
0262 }
0263 }
0264 if (ac & ((1 << bits) - 1))
0265 return -1;
0266 return bp - dst;
0267 }
0268
0269 bool __fscrypt_fname_encrypted_size(const union fscrypt_policy *policy,
0270 u32 orig_len, u32 max_len,
0271 u32 *encrypted_len_ret)
0272 {
0273 int padding = 4 << (fscrypt_policy_flags(policy) &
0274 FSCRYPT_POLICY_FLAGS_PAD_MASK);
0275 u32 encrypted_len;
0276
0277 if (orig_len > max_len)
0278 return false;
0279 encrypted_len = max_t(u32, orig_len, FSCRYPT_FNAME_MIN_MSG_LEN);
0280 encrypted_len = round_up(encrypted_len, padding);
0281 *encrypted_len_ret = min(encrypted_len, max_len);
0282 return true;
0283 }
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299 bool fscrypt_fname_encrypted_size(const struct inode *inode, u32 orig_len,
0300 u32 max_len, u32 *encrypted_len_ret)
0301 {
0302 return __fscrypt_fname_encrypted_size(&inode->i_crypt_info->ci_policy,
0303 orig_len, max_len,
0304 encrypted_len_ret);
0305 }
0306 EXPORT_SYMBOL_GPL(fscrypt_fname_encrypted_size);
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319 int fscrypt_fname_alloc_buffer(u32 max_encrypted_len,
0320 struct fscrypt_str *crypto_str)
0321 {
0322 u32 max_presented_len = max_t(u32, FSCRYPT_NOKEY_NAME_MAX_ENCODED,
0323 max_encrypted_len);
0324
0325 crypto_str->name = kmalloc(max_presented_len + 1, GFP_NOFS);
0326 if (!crypto_str->name)
0327 return -ENOMEM;
0328 crypto_str->len = max_presented_len;
0329 return 0;
0330 }
0331 EXPORT_SYMBOL(fscrypt_fname_alloc_buffer);
0332
0333
0334
0335
0336
0337
0338
0339 void fscrypt_fname_free_buffer(struct fscrypt_str *crypto_str)
0340 {
0341 if (!crypto_str)
0342 return;
0343 kfree(crypto_str->name);
0344 crypto_str->name = NULL;
0345 }
0346 EXPORT_SYMBOL(fscrypt_fname_free_buffer);
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369 int fscrypt_fname_disk_to_usr(const struct inode *inode,
0370 u32 hash, u32 minor_hash,
0371 const struct fscrypt_str *iname,
0372 struct fscrypt_str *oname)
0373 {
0374 const struct qstr qname = FSTR_TO_QSTR(iname);
0375 struct fscrypt_nokey_name nokey_name;
0376 u32 size;
0377
0378 if (fscrypt_is_dot_dotdot(&qname)) {
0379 oname->name[0] = '.';
0380 oname->name[iname->len - 1] = '.';
0381 oname->len = iname->len;
0382 return 0;
0383 }
0384
0385 if (iname->len < FSCRYPT_FNAME_MIN_MSG_LEN)
0386 return -EUCLEAN;
0387
0388 if (fscrypt_has_encryption_key(inode))
0389 return fname_decrypt(inode, iname, oname);
0390
0391
0392
0393
0394
0395 BUILD_BUG_ON(offsetofend(struct fscrypt_nokey_name, dirhash) !=
0396 offsetof(struct fscrypt_nokey_name, bytes));
0397 BUILD_BUG_ON(offsetofend(struct fscrypt_nokey_name, bytes) !=
0398 offsetof(struct fscrypt_nokey_name, sha256));
0399 BUILD_BUG_ON(FSCRYPT_NOKEY_NAME_MAX_ENCODED > NAME_MAX);
0400
0401 nokey_name.dirhash[0] = hash;
0402 nokey_name.dirhash[1] = minor_hash;
0403
0404 if (iname->len <= sizeof(nokey_name.bytes)) {
0405 memcpy(nokey_name.bytes, iname->name, iname->len);
0406 size = offsetof(struct fscrypt_nokey_name, bytes[iname->len]);
0407 } else {
0408 memcpy(nokey_name.bytes, iname->name, sizeof(nokey_name.bytes));
0409
0410 sha256(&iname->name[sizeof(nokey_name.bytes)],
0411 iname->len - sizeof(nokey_name.bytes),
0412 nokey_name.sha256);
0413 size = FSCRYPT_NOKEY_NAME_MAX;
0414 }
0415 oname->len = fscrypt_base64url_encode((const u8 *)&nokey_name, size,
0416 oname->name);
0417 return 0;
0418 }
0419 EXPORT_SYMBOL(fscrypt_fname_disk_to_usr);
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444 int fscrypt_setup_filename(struct inode *dir, const struct qstr *iname,
0445 int lookup, struct fscrypt_name *fname)
0446 {
0447 struct fscrypt_nokey_name *nokey_name;
0448 int ret;
0449
0450 memset(fname, 0, sizeof(struct fscrypt_name));
0451 fname->usr_fname = iname;
0452
0453 if (!IS_ENCRYPTED(dir) || fscrypt_is_dot_dotdot(iname)) {
0454 fname->disk_name.name = (unsigned char *)iname->name;
0455 fname->disk_name.len = iname->len;
0456 return 0;
0457 }
0458 ret = fscrypt_get_encryption_info(dir, lookup);
0459 if (ret)
0460 return ret;
0461
0462 if (fscrypt_has_encryption_key(dir)) {
0463 if (!fscrypt_fname_encrypted_size(dir, iname->len, NAME_MAX,
0464 &fname->crypto_buf.len))
0465 return -ENAMETOOLONG;
0466 fname->crypto_buf.name = kmalloc(fname->crypto_buf.len,
0467 GFP_NOFS);
0468 if (!fname->crypto_buf.name)
0469 return -ENOMEM;
0470
0471 ret = fscrypt_fname_encrypt(dir, iname, fname->crypto_buf.name,
0472 fname->crypto_buf.len);
0473 if (ret)
0474 goto errout;
0475 fname->disk_name.name = fname->crypto_buf.name;
0476 fname->disk_name.len = fname->crypto_buf.len;
0477 return 0;
0478 }
0479 if (!lookup)
0480 return -ENOKEY;
0481 fname->is_nokey_name = true;
0482
0483
0484
0485
0486
0487
0488 if (iname->len > FSCRYPT_NOKEY_NAME_MAX_ENCODED)
0489 return -ENOENT;
0490
0491 fname->crypto_buf.name = kmalloc(FSCRYPT_NOKEY_NAME_MAX, GFP_KERNEL);
0492 if (fname->crypto_buf.name == NULL)
0493 return -ENOMEM;
0494
0495 ret = fscrypt_base64url_decode(iname->name, iname->len,
0496 fname->crypto_buf.name);
0497 if (ret < (int)offsetof(struct fscrypt_nokey_name, bytes[1]) ||
0498 (ret > offsetof(struct fscrypt_nokey_name, sha256) &&
0499 ret != FSCRYPT_NOKEY_NAME_MAX)) {
0500 ret = -ENOENT;
0501 goto errout;
0502 }
0503 fname->crypto_buf.len = ret;
0504
0505 nokey_name = (void *)fname->crypto_buf.name;
0506 fname->hash = nokey_name->dirhash[0];
0507 fname->minor_hash = nokey_name->dirhash[1];
0508 if (ret != FSCRYPT_NOKEY_NAME_MAX) {
0509
0510 fname->disk_name.name = nokey_name->bytes;
0511 fname->disk_name.len =
0512 ret - offsetof(struct fscrypt_nokey_name, bytes);
0513 }
0514 return 0;
0515
0516 errout:
0517 kfree(fname->crypto_buf.name);
0518 return ret;
0519 }
0520 EXPORT_SYMBOL(fscrypt_setup_filename);
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536 bool fscrypt_match_name(const struct fscrypt_name *fname,
0537 const u8 *de_name, u32 de_name_len)
0538 {
0539 const struct fscrypt_nokey_name *nokey_name =
0540 (const void *)fname->crypto_buf.name;
0541 u8 digest[SHA256_DIGEST_SIZE];
0542
0543 if (likely(fname->disk_name.name)) {
0544 if (de_name_len != fname->disk_name.len)
0545 return false;
0546 return !memcmp(de_name, fname->disk_name.name, de_name_len);
0547 }
0548 if (de_name_len <= sizeof(nokey_name->bytes))
0549 return false;
0550 if (memcmp(de_name, nokey_name->bytes, sizeof(nokey_name->bytes)))
0551 return false;
0552 sha256(&de_name[sizeof(nokey_name->bytes)],
0553 de_name_len - sizeof(nokey_name->bytes), digest);
0554 return !memcmp(digest, nokey_name->sha256, sizeof(digest));
0555 }
0556 EXPORT_SYMBOL_GPL(fscrypt_match_name);
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569 u64 fscrypt_fname_siphash(const struct inode *dir, const struct qstr *name)
0570 {
0571 const struct fscrypt_info *ci = dir->i_crypt_info;
0572
0573 WARN_ON(!ci->ci_dirhash_key_initialized);
0574
0575 return siphash(name->name, name->len, &ci->ci_dirhash_key);
0576 }
0577 EXPORT_SYMBOL_GPL(fscrypt_fname_siphash);
0578
0579
0580
0581
0582
0583 int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags)
0584 {
0585 struct dentry *dir;
0586 int err;
0587 int valid;
0588
0589
0590
0591
0592
0593
0594 if (!(dentry->d_flags & DCACHE_NOKEY_NAME))
0595 return 1;
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609 if (flags & LOOKUP_RCU)
0610 return -ECHILD;
0611
0612 dir = dget_parent(dentry);
0613
0614
0615
0616
0617 err = fscrypt_get_encryption_info(d_inode(dir), true);
0618 valid = !fscrypt_has_encryption_key(d_inode(dir));
0619 dput(dir);
0620
0621 if (err < 0)
0622 return err;
0623
0624 return valid;
0625 }
0626 EXPORT_SYMBOL_GPL(fscrypt_d_revalidate);