1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * This contains functions for filename crypto management 4 * 5 * Copyright (C) 2015, Google, Inc. 6 * Copyright (C) 2015, Motorola Mobility 7 * 8 * Written by Uday Savagaonkar, 2014. 9 * Modified by Jaegeuk Kim, 2015. 10 * 11 * This has not yet undergone a rigorous security audit. 12 */ 13 14 #include <linux/namei.h> 15 #include <linux/scatterlist.h> 16 #include <crypto/hash.h> 17 #include <crypto/sha2.h> 18 #include <crypto/skcipher.h> 19 #include "fscrypt_private.h" 20 21 /* 22 * The minimum message length (input and output length), in bytes, for all 23 * filenames encryption modes. Filenames shorter than this will be zero-padded 24 * before being encrypted. 25 */ 26 #define FSCRYPT_FNAME_MIN_MSG_LEN 16 27 28 /* 29 * struct fscrypt_nokey_name - identifier for directory entry when key is absent 30 * 31 * When userspace lists an encrypted directory without access to the key, the 32 * filesystem must present a unique "no-key name" for each filename that allows 33 * it to find the directory entry again if requested. Naively, that would just 34 * mean using the ciphertext filenames. However, since the ciphertext filenames 35 * can contain illegal characters ('\0' and '/'), they must be encoded in some 36 * way. We use base64url. But that can cause names to exceed NAME_MAX (255 37 * bytes), so we also need to use a strong hash to abbreviate long names. 38 * 39 * The filesystem may also need another kind of hash, the "dirhash", to quickly 40 * find the directory entry. Since filesystems normally compute the dirhash 41 * over the on-disk filename (i.e. the ciphertext), it's not computable from 42 * no-key names that abbreviate the ciphertext using the strong hash to fit in 43 * NAME_MAX. It's also not computable if it's a keyed hash taken over the 44 * plaintext (but it may still be available in the on-disk directory entry); 45 * casefolded directories use this type of dirhash. At least in these cases, 46 * each no-key name must include the name's dirhash too. 47 * 48 * To meet all these requirements, we base64url-encode the following 49 * variable-length structure. It contains the dirhash, or 0's if the filesystem 50 * didn't provide one; up to 149 bytes of the ciphertext name; and for 51 * ciphertexts longer than 149 bytes, also the SHA-256 of the remaining bytes. 52 * 53 * This ensures that each no-key name contains everything needed to find the 54 * directory entry again, contains only legal characters, doesn't exceed 55 * NAME_MAX, is unambiguous unless there's a SHA-256 collision, and that we only 56 * take the performance hit of SHA-256 on very long filenames (which are rare). 57 */ 58 struct fscrypt_nokey_name { 59 u32 dirhash[2]; 60 u8 bytes[149]; 61 u8 sha256[SHA256_DIGEST_SIZE]; 62 }; /* 189 bytes => 252 bytes base64url-encoded, which is <= NAME_MAX (255) */ 63 64 /* 65 * Decoded size of max-size no-key name, i.e. a name that was abbreviated using 66 * the strong hash and thus includes the 'sha256' field. This isn't simply 67 * sizeof(struct fscrypt_nokey_name), as the padding at the end isn't included. 68 */ 69 #define FSCRYPT_NOKEY_NAME_MAX offsetofend(struct fscrypt_nokey_name, sha256) 70 71 /* Encoded size of max-size no-key name */ 72 #define FSCRYPT_NOKEY_NAME_MAX_ENCODED \ 73 FSCRYPT_BASE64URL_CHARS(FSCRYPT_NOKEY_NAME_MAX) 74 75 static inline bool fscrypt_is_dot_dotdot(const struct qstr *str) 76 { 77 if (str->len == 1 && str->name[0] == '.') 78 return true; 79 80 if (str->len == 2 && str->name[0] == '.' && str->name[1] == '.') 81 return true; 82 83 return false; 84 } 85 86 /** 87 * fscrypt_fname_encrypt() - encrypt a filename 88 * @inode: inode of the parent directory (for regular filenames) 89 * or of the symlink (for symlink targets). Key must already be 90 * set up. 91 * @iname: the filename to encrypt 92 * @out: (output) the encrypted filename 93 * @olen: size of the encrypted filename. It must be at least @iname->len. 94 * Any extra space is filled with NUL padding before encryption. 95 * 96 * Return: 0 on success, -errno on failure 97 */ 98 int fscrypt_fname_encrypt(const struct inode *inode, const struct qstr *iname, 99 u8 *out, unsigned int olen) 100 { 101 struct skcipher_request *req = NULL; 102 DECLARE_CRYPTO_WAIT(wait); 103 const struct fscrypt_info *ci = inode->i_crypt_info; 104 struct crypto_skcipher *tfm = ci->ci_enc_key.tfm; 105 union fscrypt_iv iv; 106 struct scatterlist sg; 107 int res; 108 109 /* 110 * Copy the filename to the output buffer for encrypting in-place and 111 * pad it with the needed number of NUL bytes. 112 */ 113 if (WARN_ON(olen < iname->len)) 114 return -ENOBUFS; 115 memcpy(out, iname->name, iname->len); 116 memset(out + iname->len, 0, olen - iname->len); 117 118 /* Initialize the IV */ 119 fscrypt_generate_iv(&iv, 0, ci); 120 121 /* Set up the encryption request */ 122 req = skcipher_request_alloc(tfm, GFP_NOFS); 123 if (!req) 124 return -ENOMEM; 125 skcipher_request_set_callback(req, 126 CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP, 127 crypto_req_done, &wait); 128 sg_init_one(&sg, out, olen); 129 skcipher_request_set_crypt(req, &sg, &sg, olen, &iv); 130 131 /* Do the encryption */ 132 res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait); 133 skcipher_request_free(req); 134 if (res < 0) { 135 fscrypt_err(inode, "Filename encryption failed: %d", res); 136 return res; 137 } 138 139 return 0; 140 } 141 EXPORT_SYMBOL_GPL(fscrypt_fname_encrypt); 142 143 /** 144 * fname_decrypt() - decrypt a filename 145 * @inode: inode of the parent directory (for regular filenames) 146 * or of the symlink (for symlink targets) 147 * @iname: the encrypted filename to decrypt 148 * @oname: (output) the decrypted filename. The caller must have allocated 149 * enough space for this, e.g. using fscrypt_fname_alloc_buffer(). 150 * 151 * Return: 0 on success, -errno on failure 152 */ 153 static int fname_decrypt(const struct inode *inode, 154 const struct fscrypt_str *iname, 155 struct fscrypt_str *oname) 156 { 157 struct skcipher_request *req = NULL; 158 DECLARE_CRYPTO_WAIT(wait); 159 struct scatterlist src_sg, dst_sg; 160 const struct fscrypt_info *ci = inode->i_crypt_info; 161 struct crypto_skcipher *tfm = ci->ci_enc_key.tfm; 162 union fscrypt_iv iv; 163 int res; 164 165 /* Allocate request */ 166 req = skcipher_request_alloc(tfm, GFP_NOFS); 167 if (!req) 168 return -ENOMEM; 169 skcipher_request_set_callback(req, 170 CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP, 171 crypto_req_done, &wait); 172 173 /* Initialize IV */ 174 fscrypt_generate_iv(&iv, 0, ci); 175 176 /* Create decryption request */ 177 sg_init_one(&src_sg, iname->name, iname->len); 178 sg_init_one(&dst_sg, oname->name, oname->len); 179 skcipher_request_set_crypt(req, &src_sg, &dst_sg, iname->len, &iv); 180 res = crypto_wait_req(crypto_skcipher_decrypt(req), &wait); 181 skcipher_request_free(req); 182 if (res < 0) { 183 fscrypt_err(inode, "Filename decryption failed: %d", res); 184 return res; 185 } 186 187 oname->len = strnlen(oname->name, iname->len); 188 return 0; 189 } 190 191 static const char base64url_table[65] = 192 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; 193 194 #define FSCRYPT_BASE64URL_CHARS(nbytes) DIV_ROUND_UP((nbytes) * 4, 3) 195 196 /** 197 * fscrypt_base64url_encode() - base64url-encode some binary data 198 * @src: the binary data to encode 199 * @srclen: the length of @src in bytes 200 * @dst: (output) the base64url-encoded string. Not NUL-terminated. 201 * 202 * Encodes data using base64url encoding, i.e. the "Base 64 Encoding with URL 203 * and Filename Safe Alphabet" specified by RFC 4648. '='-padding isn't used, 204 * as it's unneeded and not required by the RFC. base64url is used instead of 205 * base64 to avoid the '/' character, which isn't allowed in filenames. 206 * 207 * Return: the length of the resulting base64url-encoded string in bytes. 208 * This will be equal to FSCRYPT_BASE64URL_CHARS(srclen). 209 */ 210 static int fscrypt_base64url_encode(const u8 *src, int srclen, char *dst) 211 { 212 u32 ac = 0; 213 int bits = 0; 214 int i; 215 char *cp = dst; 216 217 for (i = 0; i < srclen; i++) { 218 ac = (ac << 8) | src[i]; 219 bits += 8; 220 do { 221 bits -= 6; 222 *cp++ = base64url_table[(ac >> bits) & 0x3f]; 223 } while (bits >= 6); 224 } 225 if (bits) 226 *cp++ = base64url_table[(ac << (6 - bits)) & 0x3f]; 227 return cp - dst; 228 } 229 230 /** 231 * fscrypt_base64url_decode() - base64url-decode a string 232 * @src: the string to decode. Doesn't need to be NUL-terminated. 233 * @srclen: the length of @src in bytes 234 * @dst: (output) the decoded binary data 235 * 236 * Decodes a string using base64url encoding, i.e. the "Base 64 Encoding with 237 * URL and Filename Safe Alphabet" specified by RFC 4648. '='-padding isn't 238 * accepted, nor are non-encoding characters such as whitespace. 239 * 240 * This implementation hasn't been optimized for performance. 241 * 242 * Return: the length of the resulting decoded binary data in bytes, 243 * or -1 if the string isn't a valid base64url string. 244 */ 245 static int fscrypt_base64url_decode(const char *src, int srclen, u8 *dst) 246 { 247 u32 ac = 0; 248 int bits = 0; 249 int i; 250 u8 *bp = dst; 251 252 for (i = 0; i < srclen; i++) { 253 const char *p = strchr(base64url_table, src[i]); 254 255 if (p == NULL || src[i] == 0) 256 return -1; 257 ac = (ac << 6) | (p - base64url_table); 258 bits += 6; 259 if (bits >= 8) { 260 bits -= 8; 261 *bp++ = (u8)(ac >> bits); 262 } 263 } 264 if (ac & ((1 << bits) - 1)) 265 return -1; 266 return bp - dst; 267 } 268 269 bool __fscrypt_fname_encrypted_size(const union fscrypt_policy *policy, 270 u32 orig_len, u32 max_len, 271 u32 *encrypted_len_ret) 272 { 273 int padding = 4 << (fscrypt_policy_flags(policy) & 274 FSCRYPT_POLICY_FLAGS_PAD_MASK); 275 u32 encrypted_len; 276 277 if (orig_len > max_len) 278 return false; 279 encrypted_len = max_t(u32, orig_len, FSCRYPT_FNAME_MIN_MSG_LEN); 280 encrypted_len = round_up(encrypted_len, padding); 281 *encrypted_len_ret = min(encrypted_len, max_len); 282 return true; 283 } 284 285 /** 286 * fscrypt_fname_encrypted_size() - calculate length of encrypted filename 287 * @inode: parent inode of dentry name being encrypted. Key must 288 * already be set up. 289 * @orig_len: length of the original filename 290 * @max_len: maximum length to return 291 * @encrypted_len_ret: where calculated length should be returned (on success) 292 * 293 * Filenames that are shorter than the maximum length may have their lengths 294 * increased slightly by encryption, due to padding that is applied. 295 * 296 * Return: false if the orig_len is greater than max_len. Otherwise, true and 297 * fill out encrypted_len_ret with the length (up to max_len). 298 */ 299 bool fscrypt_fname_encrypted_size(const struct inode *inode, u32 orig_len, 300 u32 max_len, u32 *encrypted_len_ret) 301 { 302 return __fscrypt_fname_encrypted_size(&inode->i_crypt_info->ci_policy, 303 orig_len, max_len, 304 encrypted_len_ret); 305 } 306 EXPORT_SYMBOL_GPL(fscrypt_fname_encrypted_size); 307 308 /** 309 * fscrypt_fname_alloc_buffer() - allocate a buffer for presented filenames 310 * @max_encrypted_len: maximum length of encrypted filenames the buffer will be 311 * used to present 312 * @crypto_str: (output) buffer to allocate 313 * 314 * Allocate a buffer that is large enough to hold any decrypted or encoded 315 * filename (null-terminated), for the given maximum encrypted filename length. 316 * 317 * Return: 0 on success, -errno on failure 318 */ 319 int fscrypt_fname_alloc_buffer(u32 max_encrypted_len, 320 struct fscrypt_str *crypto_str) 321 { 322 u32 max_presented_len = max_t(u32, FSCRYPT_NOKEY_NAME_MAX_ENCODED, 323 max_encrypted_len); 324 325 crypto_str->name = kmalloc(max_presented_len + 1, GFP_NOFS); 326 if (!crypto_str->name) 327 return -ENOMEM; 328 crypto_str->len = max_presented_len; 329 return 0; 330 } 331 EXPORT_SYMBOL(fscrypt_fname_alloc_buffer); 332 333 /** 334 * fscrypt_fname_free_buffer() - free a buffer for presented filenames 335 * @crypto_str: the buffer to free 336 * 337 * Free a buffer that was allocated by fscrypt_fname_alloc_buffer(). 338 */ 339 void fscrypt_fname_free_buffer(struct fscrypt_str *crypto_str) 340 { 341 if (!crypto_str) 342 return; 343 kfree(crypto_str->name); 344 crypto_str->name = NULL; 345 } 346 EXPORT_SYMBOL(fscrypt_fname_free_buffer); 347 348 /** 349 * fscrypt_fname_disk_to_usr() - convert an encrypted filename to 350 * user-presentable form 351 * @inode: inode of the parent directory (for regular filenames) 352 * or of the symlink (for symlink targets) 353 * @hash: first part of the name's dirhash, if applicable. This only needs to 354 * be provided if the filename is located in an indexed directory whose 355 * encryption key may be unavailable. Not needed for symlink targets. 356 * @minor_hash: second part of the name's dirhash, if applicable 357 * @iname: encrypted filename to convert. May also be "." or "..", which 358 * aren't actually encrypted. 359 * @oname: output buffer for the user-presentable filename. The caller must 360 * have allocated enough space for this, e.g. using 361 * fscrypt_fname_alloc_buffer(). 362 * 363 * If the key is available, we'll decrypt the disk name. Otherwise, we'll 364 * encode it for presentation in fscrypt_nokey_name format. 365 * See struct fscrypt_nokey_name for details. 366 * 367 * Return: 0 on success, -errno on failure 368 */ 369 int fscrypt_fname_disk_to_usr(const struct inode *inode, 370 u32 hash, u32 minor_hash, 371 const struct fscrypt_str *iname, 372 struct fscrypt_str *oname) 373 { 374 const struct qstr qname = FSTR_TO_QSTR(iname); 375 struct fscrypt_nokey_name nokey_name; 376 u32 size; /* size of the unencoded no-key name */ 377 378 if (fscrypt_is_dot_dotdot(&qname)) { 379 oname->name[0] = '.'; 380 oname->name[iname->len - 1] = '.'; 381 oname->len = iname->len; 382 return 0; 383 } 384 385 if (iname->len < FSCRYPT_FNAME_MIN_MSG_LEN) 386 return -EUCLEAN; 387 388 if (fscrypt_has_encryption_key(inode)) 389 return fname_decrypt(inode, iname, oname); 390 391 /* 392 * Sanity check that struct fscrypt_nokey_name doesn't have padding 393 * between fields and that its encoded size never exceeds NAME_MAX. 394 */ 395 BUILD_BUG_ON(offsetofend(struct fscrypt_nokey_name, dirhash) != 396 offsetof(struct fscrypt_nokey_name, bytes)); 397 BUILD_BUG_ON(offsetofend(struct fscrypt_nokey_name, bytes) != 398 offsetof(struct fscrypt_nokey_name, sha256)); 399 BUILD_BUG_ON(FSCRYPT_NOKEY_NAME_MAX_ENCODED > NAME_MAX); 400 401 nokey_name.dirhash[0] = hash; 402 nokey_name.dirhash[1] = minor_hash; 403 404 if (iname->len <= sizeof(nokey_name.bytes)) { 405 memcpy(nokey_name.bytes, iname->name, iname->len); 406 size = offsetof(struct fscrypt_nokey_name, bytes[iname->len]); 407 } else { 408 memcpy(nokey_name.bytes, iname->name, sizeof(nokey_name.bytes)); 409 /* Compute strong hash of remaining part of name. */ 410 sha256(&iname->name[sizeof(nokey_name.bytes)], 411 iname->len - sizeof(nokey_name.bytes), 412 nokey_name.sha256); 413 size = FSCRYPT_NOKEY_NAME_MAX; 414 } 415 oname->len = fscrypt_base64url_encode((const u8 *)&nokey_name, size, 416 oname->name); 417 return 0; 418 } 419 EXPORT_SYMBOL(fscrypt_fname_disk_to_usr); 420 421 /** 422 * fscrypt_setup_filename() - prepare to search a possibly encrypted directory 423 * @dir: the directory that will be searched 424 * @iname: the user-provided filename being searched for 425 * @lookup: 1 if we're allowed to proceed without the key because it's 426 * ->lookup() or we're finding the dir_entry for deletion; 0 if we cannot 427 * proceed without the key because we're going to create the dir_entry. 428 * @fname: the filename information to be filled in 429 * 430 * Given a user-provided filename @iname, this function sets @fname->disk_name 431 * to the name that would be stored in the on-disk directory entry, if possible. 432 * If the directory is unencrypted this is simply @iname. Else, if we have the 433 * directory's encryption key, then @iname is the plaintext, so we encrypt it to 434 * get the disk_name. 435 * 436 * Else, for keyless @lookup operations, @iname should be a no-key name, so we 437 * decode it to get the struct fscrypt_nokey_name. Non-@lookup operations will 438 * be impossible in this case, so we fail them with ENOKEY. 439 * 440 * If successful, fscrypt_free_filename() must be called later to clean up. 441 * 442 * Return: 0 on success, -errno on failure 443 */ 444 int fscrypt_setup_filename(struct inode *dir, const struct qstr *iname, 445 int lookup, struct fscrypt_name *fname) 446 { 447 struct fscrypt_nokey_name *nokey_name; 448 int ret; 449 450 memset(fname, 0, sizeof(struct fscrypt_name)); 451 fname->usr_fname = iname; 452 453 if (!IS_ENCRYPTED(dir) || fscrypt_is_dot_dotdot(iname)) { 454 fname->disk_name.name = (unsigned char *)iname->name; 455 fname->disk_name.len = iname->len; 456 return 0; 457 } 458 ret = fscrypt_get_encryption_info(dir, lookup); 459 if (ret) 460 return ret; 461 462 if (fscrypt_has_encryption_key(dir)) { 463 if (!fscrypt_fname_encrypted_size(dir, iname->len, NAME_MAX, 464 &fname->crypto_buf.len)) 465 return -ENAMETOOLONG; 466 fname->crypto_buf.name = kmalloc(fname->crypto_buf.len, 467 GFP_NOFS); 468 if (!fname->crypto_buf.name) 469 return -ENOMEM; 470 471 ret = fscrypt_fname_encrypt(dir, iname, fname->crypto_buf.name, 472 fname->crypto_buf.len); 473 if (ret) 474 goto errout; 475 fname->disk_name.name = fname->crypto_buf.name; 476 fname->disk_name.len = fname->crypto_buf.len; 477 return 0; 478 } 479 if (!lookup) 480 return -ENOKEY; 481 fname->is_nokey_name = true; 482 483 /* 484 * We don't have the key and we are doing a lookup; decode the 485 * user-supplied name 486 */ 487 488 if (iname->len > FSCRYPT_NOKEY_NAME_MAX_ENCODED) 489 return -ENOENT; 490 491 fname->crypto_buf.name = kmalloc(FSCRYPT_NOKEY_NAME_MAX, GFP_KERNEL); 492 if (fname->crypto_buf.name == NULL) 493 return -ENOMEM; 494 495 ret = fscrypt_base64url_decode(iname->name, iname->len, 496 fname->crypto_buf.name); 497 if (ret < (int)offsetof(struct fscrypt_nokey_name, bytes[1]) || 498 (ret > offsetof(struct fscrypt_nokey_name, sha256) && 499 ret != FSCRYPT_NOKEY_NAME_MAX)) { 500 ret = -ENOENT; 501 goto errout; 502 } 503 fname->crypto_buf.len = ret; 504 505 nokey_name = (void *)fname->crypto_buf.name; 506 fname->hash = nokey_name->dirhash[0]; 507 fname->minor_hash = nokey_name->dirhash[1]; 508 if (ret != FSCRYPT_NOKEY_NAME_MAX) { 509 /* The full ciphertext filename is available. */ 510 fname->disk_name.name = nokey_name->bytes; 511 fname->disk_name.len = 512 ret - offsetof(struct fscrypt_nokey_name, bytes); 513 } 514 return 0; 515 516 errout: 517 kfree(fname->crypto_buf.name); 518 return ret; 519 } 520 EXPORT_SYMBOL(fscrypt_setup_filename); 521 522 /** 523 * fscrypt_match_name() - test whether the given name matches a directory entry 524 * @fname: the name being searched for 525 * @de_name: the name from the directory entry 526 * @de_name_len: the length of @de_name in bytes 527 * 528 * Normally @fname->disk_name will be set, and in that case we simply compare 529 * that to the name stored in the directory entry. The only exception is that 530 * if we don't have the key for an encrypted directory and the name we're 531 * looking for is very long, then we won't have the full disk_name and instead 532 * we'll need to match against a fscrypt_nokey_name that includes a strong hash. 533 * 534 * Return: %true if the name matches, otherwise %false. 535 */ 536 bool fscrypt_match_name(const struct fscrypt_name *fname, 537 const u8 *de_name, u32 de_name_len) 538 { 539 const struct fscrypt_nokey_name *nokey_name = 540 (const void *)fname->crypto_buf.name; 541 u8 digest[SHA256_DIGEST_SIZE]; 542 543 if (likely(fname->disk_name.name)) { 544 if (de_name_len != fname->disk_name.len) 545 return false; 546 return !memcmp(de_name, fname->disk_name.name, de_name_len); 547 } 548 if (de_name_len <= sizeof(nokey_name->bytes)) 549 return false; 550 if (memcmp(de_name, nokey_name->bytes, sizeof(nokey_name->bytes))) 551 return false; 552 sha256(&de_name[sizeof(nokey_name->bytes)], 553 de_name_len - sizeof(nokey_name->bytes), digest); 554 return !memcmp(digest, nokey_name->sha256, sizeof(digest)); 555 } 556 EXPORT_SYMBOL_GPL(fscrypt_match_name); 557 558 /** 559 * fscrypt_fname_siphash() - calculate the SipHash of a filename 560 * @dir: the parent directory 561 * @name: the filename to calculate the SipHash of 562 * 563 * Given a plaintext filename @name and a directory @dir which uses SipHash as 564 * its dirhash method and has had its fscrypt key set up, this function 565 * calculates the SipHash of that name using the directory's secret dirhash key. 566 * 567 * Return: the SipHash of @name using the hash key of @dir 568 */ 569 u64 fscrypt_fname_siphash(const struct inode *dir, const struct qstr *name) 570 { 571 const struct fscrypt_info *ci = dir->i_crypt_info; 572 573 WARN_ON(!ci->ci_dirhash_key_initialized); 574 575 return siphash(name->name, name->len, &ci->ci_dirhash_key); 576 } 577 EXPORT_SYMBOL_GPL(fscrypt_fname_siphash); 578 579 /* 580 * Validate dentries in encrypted directories to make sure we aren't potentially 581 * caching stale dentries after a key has been added. 582 */ 583 int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags) 584 { 585 struct dentry *dir; 586 int err; 587 int valid; 588 589 /* 590 * Plaintext names are always valid, since fscrypt doesn't support 591 * reverting to no-key names without evicting the directory's inode 592 * -- which implies eviction of the dentries in the directory. 593 */ 594 if (!(dentry->d_flags & DCACHE_NOKEY_NAME)) 595 return 1; 596 597 /* 598 * No-key name; valid if the directory's key is still unavailable. 599 * 600 * Although fscrypt forbids rename() on no-key names, we still must use 601 * dget_parent() here rather than use ->d_parent directly. That's 602 * because a corrupted fs image may contain directory hard links, which 603 * the VFS handles by moving the directory's dentry tree in the dcache 604 * each time ->lookup() finds the directory and it already has a dentry 605 * elsewhere. Thus ->d_parent can be changing, and we must safely grab 606 * a reference to some ->d_parent to prevent it from being freed. 607 */ 608 609 if (flags & LOOKUP_RCU) 610 return -ECHILD; 611 612 dir = dget_parent(dentry); 613 /* 614 * Pass allow_unsupported=true, so that files with an unsupported 615 * encryption policy can be deleted. 616 */ 617 err = fscrypt_get_encryption_info(d_inode(dir), true); 618 valid = !fscrypt_has_encryption_key(d_inode(dir)); 619 dput(dir); 620 621 if (err < 0) 622 return err; 623 624 return valid; 625 } 626 EXPORT_SYMBOL_GPL(fscrypt_d_revalidate); 627