Whamcloud - gitweb
LU-17504 build: fix gcc-13 [-Werror=stringop-overread] error
[fs/lustre-release.git] / libcfs / include / libcfs / crypto / llcrypt.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * llcrypt.h: declarations for per-file encryption
4  *
5  * Filesystems that implement per-file encryption must include this header
6  * file.
7  *
8  * Copyright (C) 2015, Google, Inc.
9  *
10  * Written by Michael Halcrow, 2015.
11  * Modified by Jaegeuk Kim, 2015.
12  */
13 /*
14  * Linux commit 219d54332a09
15  * tags/v5.4
16  */
17 #ifndef _LINUX_LLCRYPT_H
18 #define _LINUX_LLCRYPT_H
19
20 #ifndef DCACHE_ENCRYPTED_NAME
21 #define DCACHE_ENCRYPTED_NAME 0x02000000
22 #endif
23
24 #include <linux/fs.h>
25 #include <linux/mm.h>
26 #include <linux/slab.h>
27 #include <lustre_disk.h>
28 #include <uapi/linux/llcrypt.h>
29
30 #define LL_CRYPTO_BLOCK_SIZE            16
31
32 struct llcrypt_ctx;
33 struct llcrypt_info;
34
35 struct llcrypt_str {
36         unsigned char *name;
37         u32 len;
38 };
39
40 struct llcrypt_name {
41         const struct qstr *usr_fname;
42         struct llcrypt_str disk_name;
43         u32 hash;
44         u32 minor_hash;
45         struct llcrypt_str crypto_buf;
46         bool is_ciphertext_name;
47 };
48
49 #define LLTR_INIT(n, l)         { .name = n, .len = l }
50 #define LLTR_TO_QSTR(f)         QSTR_INIT((f)->name, (f)->len)
51 #define lname_name(p)           ((p)->disk_name.name)
52 #define lname_len(p)            ((p)->disk_name.len)
53
54 /* Maximum value for the third parameter of llcrypt_operations.set_context(). */
55 #define LLCRYPT_SET_CONTEXT_MAX_SIZE    40
56 #define LLCRYPT_DIGESTED_CHAR_OLD       '_'
57 #define LLCRYPT_DIGESTED_CHAR           '+'
58
59 #ifdef CONFIG_LL_ENCRYPTION
60 /*
61  * llcrypt superblock flags
62  */
63 #define LL_CFLG_OWN_PAGES (1U << 1)
64
65 /*
66  * crypto operations for filesystems
67  */
68 struct llcrypt_operations {
69         unsigned int flags;
70         const char *key_prefix;
71         int (*get_context)(struct inode *, void *, size_t);
72         int (*set_context)(struct inode *, const void *, size_t, void *);
73         bool (*dummy_context)(struct inode *);
74         bool (*empty_dir)(struct inode *);
75         unsigned int max_namelen;
76 };
77
78 /* Decryption work */
79 struct llcrypt_ctx {
80         union {
81                 struct {
82                         struct bio *bio;
83                         struct work_struct work;
84                 };
85                 struct list_head free_list;     /* Free list */
86         };
87         u8 flags;                               /* Flags */
88 };
89
90 extern bool llcrypt_has_encryption_key(const struct inode *inode);
91
92 static inline bool llcrypt_dummy_context_enabled(struct inode *inode)
93 {
94         struct lustre_sb_info *lsi = s2lsi(inode->i_sb);
95
96         if (unlikely(!lsi))
97                 return false;
98
99         return lsi->lsi_cop->dummy_context &&
100                 lsi->lsi_cop->dummy_context(inode);
101 }
102
103 /*
104  * When d_splice_alias() moves a directory's encrypted alias to its decrypted
105  * alias as a result of the encryption key being added, DCACHE_ENCRYPTED_NAME
106  * must be cleared.  Note that we don't have to support arbitrary moves of this
107  * flag because llcrypt doesn't allow encrypted aliases to be the source or
108  * target of a rename().
109  */
110 static inline void llcrypt_handle_d_move(struct dentry *dentry)
111 {
112         dentry->d_flags &= ~DCACHE_ENCRYPTED_NAME;
113 }
114
115 /* crypto.c */
116 extern int __init llcrypt_init(void);
117 extern void __exit llcrypt_exit(void);
118 extern void llcrypt_enqueue_decrypt_work(struct work_struct *);
119 extern struct llcrypt_ctx *llcrypt_get_ctx(gfp_t);
120 extern void llcrypt_release_ctx(struct llcrypt_ctx *);
121
122 extern struct page *llcrypt_encrypt_pagecache_blocks(struct page *page,
123                                                      unsigned int len,
124                                                      unsigned int offs,
125                                                      gfp_t gfp_flags);
126 extern int llcrypt_encrypt_block(const struct inode *inode, struct page *src,
127                          struct page *dst, unsigned int len,
128                          unsigned int offs, u64 lblk_num, gfp_t gfp_flags);
129
130 extern int llcrypt_decrypt_pagecache_blocks(struct page *page, unsigned int len,
131                                             unsigned int offs);
132
133 extern int llcrypt_decrypt_block(const struct inode *inode, struct page *src,
134                          struct page *dst, unsigned int len,
135                          unsigned int offs, u64 lblk_num, gfp_t gfp_flags);
136
137 static inline int llcrypt_decrypt_block_inplace(const struct inode *inode,
138                                                 struct page *page,
139                                                 unsigned int len,
140                                                 unsigned int offs,
141                                                 u64 lblk_num)
142 {
143         return llcrypt_decrypt_block(inode, page, page, len, offs, lblk_num,
144                                      GFP_NOFS);
145 }
146
147 static inline bool llcrypt_is_bounce_page(struct page *page)
148 {
149         return page->mapping == NULL;
150 }
151
152 static inline struct page *llcrypt_pagecache_page(struct page *bounce_page)
153 {
154         return (struct page *)page_private(bounce_page);
155 }
156
157 extern void llcrypt_free_bounce_page(struct page *bounce_page);
158
159 /* policy.c */
160 extern int llcrypt_ioctl_set_policy(struct file *, const void __user *);
161 extern int llcrypt_ioctl_get_policy(struct file *, void __user *);
162 extern int llcrypt_ioctl_get_policy_ex(struct file *, void __user *);
163 extern int llcrypt_has_permitted_context(struct inode *, struct inode *);
164 extern int llcrypt_inherit_context(struct inode *, struct inode *,
165                                         void *, bool);
166 extern bool llcrypt_policy_has_filename_enc(struct inode *inode);
167 /* keyring.c */
168 extern void llcrypt_sb_free(struct lustre_sb_info *lsi);
169 extern int llcrypt_ioctl_add_key(struct file *filp, void __user *arg);
170 extern int llcrypt_ioctl_remove_key(struct file *filp, void __user *arg);
171 extern int llcrypt_ioctl_remove_key_all_users(struct file *filp,
172                                               void __user *arg);
173 extern int llcrypt_ioctl_get_key_status(struct file *filp, void __user *arg);
174
175 /* keysetup.c */
176 extern int llcrypt_get_encryption_info(struct inode *);
177 extern void llcrypt_put_encryption_info(struct inode *);
178 extern void llcrypt_free_inode(struct inode *);
179 extern int llcrypt_drop_inode(struct inode *inode);
180
181 /* fname.c */
182 extern int llcrypt_setup_filename(struct inode *, const struct qstr *,
183                                 int lookup, struct llcrypt_name *);
184
185 static inline void llcrypt_free_filename(struct llcrypt_name *fname)
186 {
187         kfree(fname->crypto_buf.name);
188 }
189
190 extern int llcrypt_fname_alloc_buffer(const struct inode *, u32,
191                                 struct llcrypt_str *);
192 extern void llcrypt_fname_free_buffer(struct llcrypt_str *);
193 extern int llcrypt_fname_disk_to_usr(struct inode *, u32, u32,
194                         const struct llcrypt_str *, struct llcrypt_str *);
195
196 #define LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE       32
197
198 /* Extracts the second-to-last ciphertext block; see explanation below */
199 #define LLCRYPT_FNAME_DIGEST(name, len) \
200         ((name) + round_down((len) - LL_CRYPTO_BLOCK_SIZE - 1, \
201                              LL_CRYPTO_BLOCK_SIZE))
202
203 #define LLCRYPT_FNAME_DIGEST_SIZE       LL_CRYPTO_BLOCK_SIZE
204
205 /**
206  * llcrypt_digested_name - alternate identifier for an on-disk filename
207  *
208  * When userspace lists an encrypted directory without access to the key,
209  * filenames whose ciphertext is longer than LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE
210  * bytes are shown in this abbreviated form (base64-encoded) rather than as the
211  * full ciphertext (base64-encoded).  This is necessary to allow supporting
212  * filenames up to NAME_MAX bytes, since base64 encoding expands the length.
213  *
214  * To make it possible for filesystems to still find the correct directory entry
215  * despite not knowing the full on-disk name, we encode any filesystem-specific
216  * 'hash' and/or 'minor_hash' which the filesystem may need for its lookups,
217  * followed by the second-to-last ciphertext block of the filename.  Due to the
218  * use of the CBC-CTS encryption mode, the second-to-last ciphertext block
219  * depends on the full plaintext.  (Note that ciphertext stealing causes the
220  * last two blocks to appear "flipped".)  This makes accidental collisions very
221  * unlikely: just a 1 in 2^128 chance for two filenames to collide even if they
222  * share the same filesystem-specific hashes.
223  *
224  * However, this scheme isn't immune to intentional collisions, which can be
225  * created by anyone able to create arbitrary plaintext filenames and view them
226  * without the key.  Making the "digest" be a real cryptographic hash like
227  * SHA-256 over the full ciphertext would prevent this, although it would be
228  * less efficient and harder to implement, especially since the filesystem would
229  * need to calculate it for each directory entry examined during a search.
230  */
231 struct llcrypt_digested_name {
232         u32 hash;
233         u32 minor_hash;
234         u8 digest[LLCRYPT_FNAME_DIGEST_SIZE];
235 };
236
237 /**
238  * llcrypt_match_name() - test whether the given name matches a directory entry
239  * @fname: the name being searched for
240  * @de_name: the name from the directory entry
241  * @de_name_len: the length of @de_name in bytes
242  *
243  * Normally @fname->disk_name will be set, and in that case we simply compare
244  * that to the name stored in the directory entry.  The only exception is that
245  * if we don't have the key for an encrypted directory and a filename in it is
246  * very long, then we won't have the full disk_name and we'll instead need to
247  * match against the llcrypt_digested_name.
248  *
249  * Return: %true if the name matches, otherwise %false.
250  */
251 static inline bool llcrypt_match_name(const struct llcrypt_name *fname,
252                                       const u8 *de_name, u32 de_name_len)
253 {
254         if (unlikely(!fname->disk_name.name)) {
255                 const struct llcrypt_digested_name *n =
256                         (const void *)fname->crypto_buf.name;
257                 if (WARN_ON_ONCE(fname->usr_fname->name[0] != '_'))
258                         return false;
259                 if (de_name_len <= LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE)
260                         return false;
261                 return !memcmp(LLCRYPT_FNAME_DIGEST(de_name, de_name_len),
262                                n->digest, LLCRYPT_FNAME_DIGEST_SIZE);
263         }
264
265         if (de_name_len != fname->disk_name.len)
266                 return false;
267         return !memcmp(de_name, fname->disk_name.name, fname->disk_name.len);
268 }
269
270 /* hooks.c */
271 extern int llcrypt_file_open(struct inode *inode, struct file *filp);
272 extern int __llcrypt_prepare_link(struct inode *inode, struct inode *dir,
273                                   struct dentry *dentry);
274 extern int __llcrypt_prepare_rename(struct inode *old_dir,
275                                     struct dentry *old_dentry,
276                                     struct inode *new_dir,
277                                     struct dentry *new_dentry,
278                                     unsigned int flags);
279 extern int __llcrypt_prepare_lookup(struct inode *dir, struct dentry *dentry,
280                                     struct llcrypt_name *fname);
281 extern int __llcrypt_prepare_symlink(struct inode *dir, unsigned int len,
282                                      unsigned int max_len,
283                                      struct llcrypt_str *disk_link);
284 extern int __llcrypt_encrypt_symlink(struct inode *inode, const char *target,
285                                      unsigned int len,
286                                      struct llcrypt_str *disk_link);
287 extern const char *llcrypt_get_symlink(struct inode *inode, const void *caddr,
288                                        unsigned int max_size,
289                                        struct delayed_call *done);
290 static inline void llcrypt_set_ops(struct super_block *sb,
291                                    const struct llcrypt_operations *lsi_cop)
292 {
293         struct lustre_sb_info *lsi = s2lsi(sb);
294
295         if (lsi)
296                 lsi->lsi_cop = lsi_cop;
297 }
298 #else  /* !CONFIG_LL_ENCRYPTION */
299
300 struct llcrypt_operations;
301 #define llcrypt_init()         0
302 #define llcrypt_exit()         {}
303
304 #undef IS_ENCRYPTED
305 #define IS_ENCRYPTED(x)        0
306
307 static inline bool llcrypt_has_encryption_key(const struct inode *inode)
308 {
309         return false;
310 }
311
312 static inline bool llcrypt_dummy_context_enabled(struct inode *inode)
313 {
314         return false;
315 }
316
317 static inline void llcrypt_handle_d_move(struct dentry *dentry)
318 {
319 }
320
321 /* crypto.c */
322 static inline void llcrypt_enqueue_decrypt_work(struct work_struct *work)
323 {
324 }
325
326 static inline struct llcrypt_ctx *llcrypt_get_ctx(gfp_t gfp_flags)
327 {
328         return ERR_PTR(-EOPNOTSUPP);
329 }
330
331 static inline void llcrypt_release_ctx(struct llcrypt_ctx *ctx)
332 {
333         return;
334 }
335
336 static inline struct page *llcrypt_encrypt_pagecache_blocks(struct page *page,
337                                                             unsigned int len,
338                                                             unsigned int offs,
339                                                             gfp_t gfp_flags)
340 {
341         return ERR_PTR(-EOPNOTSUPP);
342 }
343
344 static inline int llcrypt_encrypt_block(const struct inode *inode,
345                                         struct page *src, struct page *dst,
346                                         unsigned int len, unsigned int offs,
347                                         u64 lblk_num, gfp_t gfp_flags)
348 {
349         return -EOPNOTSUPP;
350 }
351
352 static inline int llcrypt_decrypt_pagecache_blocks(struct page *page,
353                                                    unsigned int len,
354                                                    unsigned int offs)
355 {
356         return -EOPNOTSUPP;
357 }
358
359 static inline int llcrypt_decrypt_block(const struct inode *inode,
360                                         struct page *src, struct page *dst,
361                                         unsigned int len, unsigned int offs,
362                                         u64 lblk_num, gfp_t gfp_flags)
363 {
364         return -EOPNOTSUPP;
365 }
366
367 static inline int llcrypt_decrypt_block_inplace(const struct inode *inode,
368                                                 struct page *page,
369                                                 unsigned int len,
370                                                 unsigned int offs, u64 lblk_num)
371 {
372         return -EOPNOTSUPP;
373 }
374
375 static inline bool llcrypt_is_bounce_page(struct page *page)
376 {
377         return false;
378 }
379
380 static inline struct page *llcrypt_pagecache_page(struct page *bounce_page)
381 {
382         WARN_ON_ONCE(1);
383         return ERR_PTR(-EINVAL);
384 }
385
386 static inline void llcrypt_free_bounce_page(struct page *bounce_page)
387 {
388 }
389
390 /* policy.c */
391 static inline int llcrypt_ioctl_set_policy(struct file *filp,
392                                            const void __user *arg)
393 {
394         return -EOPNOTSUPP;
395 }
396
397 static inline int llcrypt_ioctl_get_policy(struct file *filp, void __user *arg)
398 {
399         return -EOPNOTSUPP;
400 }
401
402 static inline int llcrypt_ioctl_get_policy_ex(struct file *filp,
403                                               void __user *arg)
404 {
405         return -EOPNOTSUPP;
406 }
407
408 static inline int llcrypt_has_permitted_context(struct inode *parent,
409                                                 struct inode *child)
410 {
411         return 0;
412 }
413
414 static inline int llcrypt_inherit_context(struct inode *parent,
415                                           struct inode *child,
416                                           void *fs_data, bool preload)
417 {
418         return -EOPNOTSUPP;
419 }
420 static inline bool llcrypt_policy_has_filename_enc(struct inode *inode)
421 {
422         return false;
423 }
424
425 /* keyring.c */
426 static inline void llcrypt_sb_free(struct lustre_sb_info *lsi)
427 {
428 }
429
430 static inline int llcrypt_ioctl_add_key(struct file *filp, void __user *arg)
431 {
432         return -EOPNOTSUPP;
433 }
434
435 static inline int llcrypt_ioctl_remove_key(struct file *filp, void __user *arg)
436 {
437         return -EOPNOTSUPP;
438 }
439
440 static inline int llcrypt_ioctl_remove_key_all_users(struct file *filp,
441                                                      void __user *arg)
442 {
443         return -EOPNOTSUPP;
444 }
445
446 static inline int llcrypt_ioctl_get_key_status(struct file *filp,
447                                                void __user *arg)
448 {
449         return -EOPNOTSUPP;
450 }
451
452 /* keysetup.c */
453 static inline int llcrypt_get_encryption_info(struct inode *inode)
454 {
455         return -EOPNOTSUPP;
456 }
457
458 static inline void llcrypt_put_encryption_info(struct inode *inode)
459 {
460         return;
461 }
462
463 static inline void llcrypt_free_inode(struct inode *inode)
464 {
465 }
466
467 static inline int llcrypt_drop_inode(struct inode *inode)
468 {
469         return 0;
470 }
471
472  /* fname.c */
473 static inline int llcrypt_setup_filename(struct inode *dir,
474                                          const struct qstr *iname,
475                                          int lookup, struct llcrypt_name *fname)
476 {
477         if (IS_ENCRYPTED(dir))
478                 return -EOPNOTSUPP;
479
480         memset(fname, 0, sizeof(*fname));
481         fname->usr_fname = iname;
482         fname->disk_name.name = (unsigned char *)iname->name;
483         fname->disk_name.len = iname->len;
484         return 0;
485 }
486
487 static inline void llcrypt_free_filename(struct llcrypt_name *fname)
488 {
489         return;
490 }
491
492 static inline int llcrypt_fname_alloc_buffer(const struct inode *inode,
493                                              u32 max_encrypted_len,
494                                              struct llcrypt_str *crypto_str)
495 {
496         return -EOPNOTSUPP;
497 }
498
499 static inline void llcrypt_fname_free_buffer(struct llcrypt_str *crypto_str)
500 {
501         return;
502 }
503
504 static inline int llcrypt_fname_disk_to_usr(struct inode *inode,
505                                             u32 hash, u32 minor_hash,
506                                             const struct llcrypt_str *iname,
507                                             struct llcrypt_str *oname)
508 {
509         return -EOPNOTSUPP;
510 }
511
512 static inline bool llcrypt_match_name(const struct llcrypt_name *fname,
513                                       const u8 *de_name, u32 de_name_len)
514 {
515         /* Encryption support disabled; use standard comparison */
516         if (de_name_len != fname->disk_name.len)
517                 return false;
518         return !memcmp(de_name, fname->disk_name.name, fname->disk_name.len);
519 }
520
521 /* hooks.c */
522
523 static inline int llcrypt_file_open(struct inode *inode, struct file *filp)
524 {
525         if (IS_ENCRYPTED(inode))
526                 return -EOPNOTSUPP;
527         return 0;
528 }
529
530 static inline int __llcrypt_prepare_link(struct inode *inode, struct inode *dir,
531                                          struct dentry *dentry)
532 {
533         return -EOPNOTSUPP;
534 }
535
536 static inline int __llcrypt_prepare_rename(struct inode *old_dir,
537                                            struct dentry *old_dentry,
538                                            struct inode *new_dir,
539                                            struct dentry *new_dentry,
540                                            unsigned int flags)
541 {
542         return -EOPNOTSUPP;
543 }
544
545 static inline int __llcrypt_prepare_lookup(struct inode *dir,
546                                            struct dentry *dentry,
547                                            struct llcrypt_name *fname)
548 {
549         return -EOPNOTSUPP;
550 }
551
552 static inline int __llcrypt_prepare_symlink(struct inode *dir,
553                                             unsigned int len,
554                                             unsigned int max_len,
555                                             struct llcrypt_str *disk_link)
556 {
557         return -EOPNOTSUPP;
558 }
559
560
561 static inline int __llcrypt_encrypt_symlink(struct inode *inode,
562                                             const char *target,
563                                             unsigned int len,
564                                             struct llcrypt_str *disk_link)
565 {
566         return -EOPNOTSUPP;
567 }
568
569 #define llcrypt_get_symlink(inode, caddr, max_size, done)   ERR_PTR(-EOPNOTSUPP)
570
571 static inline void llcrypt_set_ops(struct super_block *sb,
572                                    const struct llcrypt_operations *lsi_cop)
573 {
574 }
575
576 #endif  /* !CONFIG_LL_ENCRYPTION */
577
578 /**
579  * llcrypt_require_key - require an inode's encryption key
580  * @inode: the inode we need the key for
581  *
582  * If the inode is encrypted, set up its encryption key if not already done.
583  * Then require that the key be present and return -ENOKEY otherwise.
584  *
585  * No locks are needed, and the key will live as long as the struct inode --- so
586  * it won't go away from under you.
587  *
588  * Return: 0 on success, -ENOKEY if the key is missing, or another -errno code
589  * if a problem occurred while setting up the encryption key.
590  */
591 static inline int llcrypt_require_key(struct inode *inode)
592 {
593         if (IS_ENCRYPTED(inode)) {
594                 int err = llcrypt_get_encryption_info(inode);
595
596                 if (err)
597                         return err;
598                 if (!llcrypt_has_encryption_key(inode))
599                         return -ENOKEY;
600         }
601         return 0;
602 }
603
604 /**
605  * llcrypt_prepare_link - prepare to link an inode into a possibly-encrypted directory
606  * @old_dentry: an existing dentry for the inode being linked
607  * @dir: the target directory
608  * @dentry: negative dentry for the target filename
609  *
610  * A new link can only be added to an encrypted directory if the directory's
611  * encryption key is available --- since otherwise we'd have no way to encrypt
612  * the filename.  Therefore, we first set up the directory's encryption key (if
613  * not already done) and return an error if it's unavailable.
614  *
615  * We also verify that the link will not violate the constraint that all files
616  * in an encrypted directory tree use the same encryption policy.
617  *
618  * Return: 0 on success, -ENOKEY if the directory's encryption key is missing,
619  * -EXDEV if the link would result in an inconsistent encryption policy, or
620  * another -errno code.
621  */
622 static inline int llcrypt_prepare_link(struct dentry *old_dentry,
623                                        struct inode *dir,
624                                        struct dentry *dentry)
625 {
626         if (IS_ENCRYPTED(dir))
627                 return __llcrypt_prepare_link(d_inode(old_dentry), dir, dentry);
628         return 0;
629 }
630
631 /**
632  * llcrypt_prepare_rename - prepare for a rename between possibly-encrypted directories
633  * @old_dir: source directory
634  * @old_dentry: dentry for source file
635  * @new_dir: target directory
636  * @new_dentry: dentry for target location (may be negative unless exchanging)
637  * @flags: rename flags (we care at least about %RENAME_EXCHANGE)
638  *
639  * Prepare for ->rename() where the source and/or target directories may be
640  * encrypted.  A new link can only be added to an encrypted directory if the
641  * directory's encryption key is available --- since otherwise we'd have no way
642  * to encrypt the filename.  A rename to an existing name, on the other hand,
643  * *is* cryptographically possible without the key.  However, we take the more
644  * conservative approach and just forbid all no-key renames.
645  *
646  * We also verify that the rename will not violate the constraint that all files
647  * in an encrypted directory tree use the same encryption policy.
648  *
649  * Return: 0 on success, -ENOKEY if an encryption key is missing, -EXDEV if the
650  * rename would cause inconsistent encryption policies, or another -errno code.
651  */
652 static inline int llcrypt_prepare_rename(struct inode *old_dir,
653                                          struct dentry *old_dentry,
654                                          struct inode *new_dir,
655                                          struct dentry *new_dentry,
656                                          unsigned int flags)
657 {
658         if (IS_ENCRYPTED(old_dir) || IS_ENCRYPTED(new_dir))
659                 return __llcrypt_prepare_rename(old_dir, old_dentry,
660                                                 new_dir, new_dentry, flags);
661         return 0;
662 }
663
664 /**
665  * llcrypt_prepare_lookup - prepare to lookup a name in a possibly-encrypted directory
666  * @dir: directory being searched
667  * @dentry: filename being looked up
668  * @fname: (output) the name to use to search the on-disk directory
669  *
670  * Prepare for ->lookup() in a directory which may be encrypted by determining
671  * the name that will actually be used to search the directory on-disk.  Lookups
672  * can be done with or without the directory's encryption key; without the key,
673  * filenames are presented in encrypted form.  Therefore, we'll try to set up
674  * the directory's encryption key, but even without it the lookup can continue.
675  *
676  * This also installs a custom ->d_revalidate() method which will invalidate the
677  * dentry if it was created without the key and the key is later added.
678  *
679  * Return: 0 on success; -ENOENT if key is unavailable but the filename isn't a
680  * correctly formed encoded ciphertext name, so a negative dentry should be
681  * created; or another -errno code.
682  */
683 static inline int llcrypt_prepare_lookup(struct inode *dir,
684                                          struct dentry *dentry,
685                                          struct llcrypt_name *fname)
686 {
687         if (IS_ENCRYPTED(dir))
688                 return __llcrypt_prepare_lookup(dir, dentry, fname);
689
690         memset(fname, 0, sizeof(*fname));
691         fname->usr_fname = &dentry->d_name;
692         fname->disk_name.name = (unsigned char *)dentry->d_name.name;
693         fname->disk_name.len = dentry->d_name.len;
694         return 0;
695 }
696
697 /**
698  * llcrypt_prepare_setattr - prepare to change a possibly-encrypted inode's attributes
699  * @dentry: dentry through which the inode is being changed
700  * @attr: attributes to change
701  *
702  * Prepare for ->setattr() on a possibly-encrypted inode.  On an encrypted file,
703  * most attribute changes are allowed even without the encryption key.  However,
704  * without the encryption key we do have to forbid truncates.  This is needed
705  * because the size being truncated to may not be a multiple of the filesystem
706  * block size, and in that case we'd have to decrypt the final block, zero the
707  * portion past i_size, and re-encrypt it.  (We *could* allow truncating to a
708  * filesystem block boundary, but it's simpler to just forbid all truncates ---
709  * and we already forbid all other contents modifications without the key.)
710  *
711  * Return: 0 on success, -ENOKEY if the key is missing, or another -errno code
712  * if a problem occurred while setting up the encryption key.
713  */
714 static inline int llcrypt_prepare_setattr(struct dentry *dentry,
715                                           struct iattr *attr)
716 {
717         if (attr->ia_valid & ATTR_SIZE)
718                 return llcrypt_require_key(d_inode(dentry));
719         return 0;
720 }
721
722 /**
723  * llcrypt_prepare_symlink - prepare to create a possibly-encrypted symlink
724  * @dir: directory in which the symlink is being created
725  * @target: plaintext symlink target
726  * @len: length of @target excluding null terminator
727  * @max_len: space the filesystem has available to store the symlink target
728  * @disk_link: (out) the on-disk symlink target being prepared
729  *
730  * This function computes the size the symlink target will require on-disk,
731  * stores it in @disk_link->len, and validates it against @max_len.  An
732  * encrypted symlink may be longer than the original.
733  *
734  * Additionally, @disk_link->name is set to @target if the symlink will be
735  * unencrypted, but left NULL if the symlink will be encrypted.  For encrypted
736  * symlinks, the filesystem must call llcrypt_encrypt_symlink() to create the
737  * on-disk target later.  (The reason for the two-step process is that some
738  * filesystems need to know the size of the symlink target before creating the
739  * inode, e.g. to determine whether it will be a "fast" or "slow" symlink.)
740  *
741  * Return: 0 on success, -ENAMETOOLONG if the symlink target is too long,
742  * -ENOKEY if the encryption key is missing, or another -errno code if a problem
743  * occurred while setting up the encryption key.
744  */
745 static inline int llcrypt_prepare_symlink(struct inode *dir,
746                                           const char *target,
747                                           unsigned int len,
748                                           unsigned int max_len,
749                                           struct llcrypt_str *disk_link)
750 {
751         if ((IS_ENCRYPTED(dir) || llcrypt_dummy_context_enabled(dir)) &&
752             llcrypt_policy_has_filename_enc(dir))
753                 return __llcrypt_prepare_symlink(dir, len, max_len, disk_link);
754
755         disk_link->name = (unsigned char *)target;
756         disk_link->len = len + 1;
757         if (disk_link->len > max_len)
758                 return -ENAMETOOLONG;
759         return 0;
760 }
761
762 /**
763  * llcrypt_encrypt_symlink - encrypt the symlink target if needed
764  * @inode: symlink inode
765  * @target: plaintext symlink target
766  * @len: length of @target excluding null terminator
767  * @disk_link: (in/out) the on-disk symlink target being prepared
768  *
769  * If the symlink target needs to be encrypted, then this function encrypts it
770  * into @disk_link->name.  llcrypt_prepare_symlink() must have been called
771  * previously to compute @disk_link->len.  If the filesystem did not allocate a
772  * buffer for @disk_link->name after calling llcrypt_prepare_link(), then one
773  * will be kmalloc()'ed and the filesystem will be responsible for freeing it.
774  *
775  * Return: 0 on success, -errno on failure
776  */
777 static inline int llcrypt_encrypt_symlink(struct inode *inode,
778                                           const char *target,
779                                           unsigned int len,
780                                           struct llcrypt_str *disk_link)
781 {
782         if (IS_ENCRYPTED(inode))
783                 return __llcrypt_encrypt_symlink(inode, target, len, disk_link);
784         return 0;
785 }
786
787 /* If *pagep is a bounce page, free it and set *pagep to the pagecache page */
788 static inline void llcrypt_finalize_bounce_page(struct page **pagep)
789 {
790         struct page *page = *pagep;
791
792         if (llcrypt_is_bounce_page(page)) {
793                 *pagep = llcrypt_pagecache_page(page);
794                 llcrypt_free_bounce_page(page);
795         }
796 }
797
798 #endif  /* _LINUX_LLCRYPT_H */