rust: upgrade to Rust 1.76.0
[sfrench/cifs-2.6.git] / fs / crypto / fname.c
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_inode_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_ONCE(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_inode_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_inode_info *ci = dir->i_crypt_info;
572
573         WARN_ON_ONCE(!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);