]> git.ipfire.org Git - people/ms/linux.git/blame - fs/crypto/fscrypt_private.h
fscrypt: add comments that describe the HKDF info strings
[people/ms/linux.git] / fs / crypto / fscrypt_private.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
3325bea5
TT
2/*
3 * fscrypt_private.h
4 *
5 * Copyright (C) 2015, Google, Inc.
6 *
3ec4f2a6
EB
7 * Originally written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar.
8 * Heavily modified since then.
3325bea5
TT
9 */
10
11#ifndef _FSCRYPT_PRIVATE_H
12#define _FSCRYPT_PRIVATE_H
13
734f0d24 14#include <linux/fscrypt.h>
aa408f83 15#include <linux/siphash.h>
b7e7cf7a 16#include <crypto/hash.h>
5fee3609 17#include <linux/blk-crypto.h>
3325bea5 18
22d94f49
EB
19#define CONST_STRLEN(str) (sizeof(str) - 1)
20
11b8818e 21#define FS_KEY_DERIVATION_NONCE_SIZE 16
cc4e0df0 22
22d94f49
EB
23#define FSCRYPT_MIN_KEY_SIZE 16
24
5dae460c
EB
25#define FSCRYPT_CONTEXT_V1 1
26#define FSCRYPT_CONTEXT_V2 2
27
28struct fscrypt_context_v1 {
29 u8 version; /* FSCRYPT_CONTEXT_V1 */
cc4e0df0
TT
30 u8 contents_encryption_mode;
31 u8 filenames_encryption_mode;
32 u8 flags;
3b6df59b 33 u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
cc4e0df0 34 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
5dae460c 35};
cc4e0df0 36
5dae460c
EB
37struct fscrypt_context_v2 {
38 u8 version; /* FSCRYPT_CONTEXT_V2 */
39 u8 contents_encryption_mode;
40 u8 filenames_encryption_mode;
41 u8 flags;
42 u8 __reserved[4];
43 u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
44 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
45};
46
d2fe9754 47/*
5dae460c
EB
48 * fscrypt_context - the encryption context of an inode
49 *
50 * This is the on-disk equivalent of an fscrypt_policy, stored alongside each
51 * encrypted file usually in a hidden extended attribute. It contains the
52 * fields from the fscrypt_policy, in order to identify the encryption algorithm
53 * and key with which the file is encrypted. It also contains a nonce that was
54 * randomly generated by fscrypt itself; this is used as KDF input or as a tweak
55 * to cause different files to be encrypted differently.
56 */
57union fscrypt_context {
58 u8 version;
59 struct fscrypt_context_v1 v1;
60 struct fscrypt_context_v2 v2;
61};
62
63/*
64 * Return the size expected for the given fscrypt_context based on its version
65 * number, or 0 if the context version is unrecognized.
66 */
67static inline int fscrypt_context_size(const union fscrypt_context *ctx)
68{
69 switch (ctx->version) {
70 case FSCRYPT_CONTEXT_V1:
71 BUILD_BUG_ON(sizeof(ctx->v1) != 28);
72 return sizeof(ctx->v1);
73 case FSCRYPT_CONTEXT_V2:
74 BUILD_BUG_ON(sizeof(ctx->v2) != 40);
75 return sizeof(ctx->v2);
76 }
77 return 0;
78}
79
e98ad464
EB
80/* Check whether an fscrypt_context has a recognized version number and size */
81static inline bool fscrypt_context_is_valid(const union fscrypt_context *ctx,
82 int ctx_size)
83{
84 return ctx_size >= 1 && ctx_size == fscrypt_context_size(ctx);
85}
86
87/* Retrieve the context's nonce, assuming the context was already validated */
88static inline const u8 *fscrypt_context_nonce(const union fscrypt_context *ctx)
89{
90 switch (ctx->version) {
91 case FSCRYPT_CONTEXT_V1:
92 return ctx->v1.nonce;
93 case FSCRYPT_CONTEXT_V2:
94 return ctx->v2.nonce;
95 }
96 WARN_ON(1);
97 return NULL;
98}
99
5dae460c
EB
100#undef fscrypt_policy
101union fscrypt_policy {
102 u8 version;
103 struct fscrypt_policy_v1 v1;
104 struct fscrypt_policy_v2 v2;
105};
106
107/*
108 * Return the size expected for the given fscrypt_policy based on its version
109 * number, or 0 if the policy version is unrecognized.
110 */
111static inline int fscrypt_policy_size(const union fscrypt_policy *policy)
112{
113 switch (policy->version) {
114 case FSCRYPT_POLICY_V1:
115 return sizeof(policy->v1);
116 case FSCRYPT_POLICY_V2:
117 return sizeof(policy->v2);
118 }
119 return 0;
120}
121
122/* Return the contents encryption mode of a valid encryption policy */
123static inline u8
124fscrypt_policy_contents_mode(const union fscrypt_policy *policy)
125{
126 switch (policy->version) {
127 case FSCRYPT_POLICY_V1:
128 return policy->v1.contents_encryption_mode;
129 case FSCRYPT_POLICY_V2:
130 return policy->v2.contents_encryption_mode;
131 }
132 BUG();
133}
134
135/* Return the filenames encryption mode of a valid encryption policy */
136static inline u8
137fscrypt_policy_fnames_mode(const union fscrypt_policy *policy)
138{
139 switch (policy->version) {
140 case FSCRYPT_POLICY_V1:
141 return policy->v1.filenames_encryption_mode;
142 case FSCRYPT_POLICY_V2:
143 return policy->v2.filenames_encryption_mode;
144 }
145 BUG();
146}
147
148/* Return the flags (FSCRYPT_POLICY_FLAG*) of a valid encryption policy */
149static inline u8
150fscrypt_policy_flags(const union fscrypt_policy *policy)
151{
152 switch (policy->version) {
153 case FSCRYPT_POLICY_V1:
154 return policy->v1.flags;
155 case FSCRYPT_POLICY_V2:
156 return policy->v2.flags;
157 }
158 BUG();
159}
160
d2fe9754 161/*
0eaab5b1
EB
162 * For encrypted symlinks, the ciphertext length is stored at the beginning
163 * of the string in little-endian format.
164 */
165struct fscrypt_symlink_data {
166 __le16 len;
167 char encrypted_path[1];
168} __packed;
169
5fee3609
ST
170/**
171 * struct fscrypt_prepared_key - a key prepared for actual encryption/decryption
172 * @tfm: crypto API transform object
173 * @blk_key: key for blk-crypto
174 *
175 * Normally only one of the fields will be non-NULL.
176 */
177struct fscrypt_prepared_key {
178 struct crypto_skcipher *tfm;
179#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
180 struct fscrypt_blk_crypto_key *blk_key;
181#endif
182};
183
cc4e0df0 184/*
8094c3ce
EB
185 * fscrypt_info - the "encryption key" for an inode
186 *
187 * When an encrypted file's key is made available, an instance of this struct is
188 * allocated and stored in ->i_crypt_info. Once created, it remains until the
189 * inode is evicted.
cc4e0df0
TT
190 */
191struct fscrypt_info {
8094c3ce 192
5fee3609
ST
193 /* The key in a form prepared for actual encryption/decryption */
194 struct fscrypt_prepared_key ci_enc_key;
8094c3ce 195
5fee3609 196 /* True if ci_enc_key should be freed when this fscrypt_info is freed */
b103fb76
EB
197 bool ci_owns_key;
198
5fee3609
ST
199#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
200 /*
201 * True if this inode will use inline encryption (blk-crypto) instead of
202 * the traditional filesystem-layer encryption.
203 */
204 bool ci_inlinecrypt;
205#endif
206
8094c3ce 207 /*
5dae460c
EB
208 * Encryption mode used for this inode. It corresponds to either the
209 * contents or filenames encryption mode, depending on the inode type.
8094c3ce
EB
210 */
211 struct fscrypt_mode *ci_mode;
212
59dc6a8e
EB
213 /* Back-pointer to the inode */
214 struct inode *ci_inode;
215
b1c0ec35
EB
216 /*
217 * The master key with which this inode was unlocked (decrypted). This
218 * will be NULL if the master key was found in a process-subscribed
219 * keyring rather than in the filesystem-level keyring.
220 */
221 struct key *ci_master_key;
222
223 /*
224 * Link in list of inodes that were unlocked with the master key.
225 * Only used when ->ci_master_key is set.
226 */
227 struct list_head ci_master_key_link;
228
8094c3ce 229 /*
a828daab 230 * If non-NULL, then encryption is done using the master key directly
5fee3609 231 * and ci_enc_key will equal ci_direct_key->dk_key.
8094c3ce 232 */
a828daab 233 struct fscrypt_direct_key *ci_direct_key;
8094c3ce 234
aa408f83
DR
235 /*
236 * This inode's hash key for filenames. This is a 128-bit SipHash-2-4
237 * key. This is only set for directories that use a keyed dirhash over
238 * the plaintext filenames -- currently just casefolded directories.
239 */
240 siphash_key_t ci_dirhash_key;
241 bool ci_dirhash_key_initialized;
242
5dae460c
EB
243 /* The encryption policy used by this inode */
244 union fscrypt_policy ci_policy;
245
246 /* This inode's nonce, copied from the fscrypt_context */
8094c3ce 247 u8 ci_nonce[FS_KEY_DERIVATION_NONCE_SIZE];
e3b1078b
EB
248
249 /* Hashed inode number. Only set for IV_INO_LBLK_32 */
250 u32 ci_hashed_ino;
cc4e0df0
TT
251};
252
58ae7468
RW
253typedef enum {
254 FS_DECRYPT = 0,
255 FS_ENCRYPT,
256} fscrypt_direction_t;
257
b98701df 258/* crypto.c */
e4de782a 259extern struct kmem_cache *fscrypt_info_cachep;
60700902
EB
260int fscrypt_initialize(unsigned int cop_flags);
261int fscrypt_crypt_block(const struct inode *inode, fscrypt_direction_t rw,
262 u64 lblk_num, struct page *src_page,
263 struct page *dest_page, unsigned int len,
264 unsigned int offs, gfp_t gfp_flags);
265struct page *fscrypt_alloc_bounce_page(gfp_t gfp_flags);
266
267void __printf(3, 4) __cold
886da8b3 268fscrypt_msg(const struct inode *inode, const char *level, const char *fmt, ...);
544d08fd 269
886da8b3
EB
270#define fscrypt_warn(inode, fmt, ...) \
271 fscrypt_msg((inode), KERN_WARNING, fmt, ##__VA_ARGS__)
272#define fscrypt_err(inode, fmt, ...) \
273 fscrypt_msg((inode), KERN_ERR, fmt, ##__VA_ARGS__)
544d08fd 274
8094c3ce
EB
275#define FSCRYPT_MAX_IV_SIZE 32
276
277union fscrypt_iv {
278 struct {
279 /* logical block number within the file */
280 __le64 lblk_num;
281
282 /* per-file nonce; only set in DIRECT_KEY mode */
283 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
284 };
285 u8 raw[FSCRYPT_MAX_IV_SIZE];
5fee3609 286 __le64 dun[FSCRYPT_MAX_IV_SIZE / sizeof(__le64)];
8094c3ce
EB
287};
288
289void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num,
290 const struct fscrypt_info *ci);
291
76e81d6d 292/* fname.c */
60700902
EB
293int fscrypt_fname_encrypt(const struct inode *inode, const struct qstr *iname,
294 u8 *out, unsigned int olen);
295bool fscrypt_fname_encrypted_size(const struct inode *inode, u32 orig_len,
296 u32 max_len, u32 *encrypted_len_ret);
2ebdef6d 297extern const struct dentry_operations fscrypt_d_ops;
76e81d6d 298
c1144c9b
EB
299/* hkdf.c */
300
301struct fscrypt_hkdf {
302 struct crypto_shash *hmac_tfm;
303};
304
60700902
EB
305int fscrypt_init_hkdf(struct fscrypt_hkdf *hkdf, const u8 *master_key,
306 unsigned int master_key_size);
c1144c9b 307
5dae460c
EB
308/*
309 * The list of contexts in which fscrypt uses HKDF. These values are used as
310 * the first byte of the HKDF application-specific info string to guarantee that
311 * info strings are never repeated between contexts. This ensures that all HKDF
312 * outputs are unique and cryptographically isolated, i.e. knowledge of one
313 * output doesn't reveal another.
314 */
e455de31
EB
315#define HKDF_CONTEXT_KEY_IDENTIFIER 1 /* info=<empty> */
316#define HKDF_CONTEXT_PER_FILE_ENC_KEY 2 /* info=file_nonce */
317#define HKDF_CONTEXT_DIRECT_KEY 3 /* info=mode_num */
318#define HKDF_CONTEXT_IV_INO_LBLK_64_KEY 4 /* info=mode_num||fs_uuid */
319#define HKDF_CONTEXT_DIRHASH_KEY 5 /* info=file_nonce */
320#define HKDF_CONTEXT_IV_INO_LBLK_32_KEY 6 /* info=mode_num||fs_uuid */
321#define HKDF_CONTEXT_INODE_HASH_KEY 7 /* info=<empty> */
5dae460c 322
60700902
EB
323int fscrypt_hkdf_expand(const struct fscrypt_hkdf *hkdf, u8 context,
324 const u8 *info, unsigned int infolen,
325 u8 *okm, unsigned int okmlen);
c1144c9b 326
60700902 327void fscrypt_destroy_hkdf(struct fscrypt_hkdf *hkdf);
c1144c9b 328
5fee3609
ST
329/* inline_crypt.c */
330#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT
331int fscrypt_select_encryption_impl(struct fscrypt_info *ci);
332
333static inline bool
334fscrypt_using_inline_encryption(const struct fscrypt_info *ci)
335{
336 return ci->ci_inlinecrypt;
337}
338
339int fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key,
340 const u8 *raw_key,
341 const struct fscrypt_info *ci);
342
343void fscrypt_destroy_inline_crypt_key(struct fscrypt_prepared_key *prep_key);
344
345/*
346 * Check whether the crypto transform or blk-crypto key has been allocated in
347 * @prep_key, depending on which encryption implementation the file will use.
348 */
349static inline bool
350fscrypt_is_key_prepared(struct fscrypt_prepared_key *prep_key,
351 const struct fscrypt_info *ci)
352{
353 /*
354 * The READ_ONCE() here pairs with the smp_store_release() in
355 * fscrypt_prepare_key(). (This only matters for the per-mode keys,
356 * which are shared by multiple inodes.)
357 */
358 if (fscrypt_using_inline_encryption(ci))
359 return READ_ONCE(prep_key->blk_key) != NULL;
360 return READ_ONCE(prep_key->tfm) != NULL;
361}
362
363#else /* CONFIG_FS_ENCRYPTION_INLINE_CRYPT */
364
365static inline int fscrypt_select_encryption_impl(struct fscrypt_info *ci)
366{
367 return 0;
368}
369
370static inline bool
371fscrypt_using_inline_encryption(const struct fscrypt_info *ci)
372{
373 return false;
374}
375
376static inline int
377fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key,
378 const u8 *raw_key,
379 const struct fscrypt_info *ci)
380{
381 WARN_ON(1);
382 return -EOPNOTSUPP;
383}
384
385static inline void
386fscrypt_destroy_inline_crypt_key(struct fscrypt_prepared_key *prep_key)
387{
388}
389
390static inline bool
391fscrypt_is_key_prepared(struct fscrypt_prepared_key *prep_key,
392 const struct fscrypt_info *ci)
393{
394 return READ_ONCE(prep_key->tfm) != NULL;
395}
396#endif /* !CONFIG_FS_ENCRYPTION_INLINE_CRYPT */
397
22d94f49
EB
398/* keyring.c */
399
400/*
401 * fscrypt_master_key_secret - secret key material of an in-use master key
402 */
403struct fscrypt_master_key_secret {
404
5dae460c
EB
405 /*
406 * For v2 policy keys: HKDF context keyed by this master key.
407 * For v1 policy keys: not set (hkdf.hmac_tfm == NULL).
408 */
409 struct fscrypt_hkdf hkdf;
410
411 /* Size of the raw key in bytes. Set even if ->raw isn't set. */
22d94f49
EB
412 u32 size;
413
5dae460c 414 /* For v1 policy keys: the raw key. Wiped for v2 policy keys. */
22d94f49
EB
415 u8 raw[FSCRYPT_MAX_KEY_SIZE];
416
417} __randomize_layout;
418
419/*
420 * fscrypt_master_key - an in-use master key
421 *
422 * This represents a master encryption key which has been added to the
423 * filesystem and can be used to "unlock" the encrypted files which were
424 * encrypted with it.
425 */
426struct fscrypt_master_key {
427
b1c0ec35
EB
428 /*
429 * The secret key material. After FS_IOC_REMOVE_ENCRYPTION_KEY is
430 * executed, this is wiped and no new inodes can be unlocked with this
431 * key; however, there may still be inodes in ->mk_decrypted_inodes
432 * which could not be evicted. As long as some inodes still remain,
433 * FS_IOC_REMOVE_ENCRYPTION_KEY can be retried, or
434 * FS_IOC_ADD_ENCRYPTION_KEY can add the secret again.
435 *
23c688b5
EB
436 * Locking: protected by key->sem (outer) and mk_secret_sem (inner).
437 * The reason for two locks is that key->sem also protects modifying
438 * mk_users, which ranks it above the semaphore for the keyring key
439 * type, which is in turn above page faults (via keyring_read). But
440 * sometimes filesystems call fscrypt_get_encryption_info() from within
441 * a transaction, which ranks it below page faults. So we need a
442 * separate lock which protects mk_secret but not also mk_users.
b1c0ec35 443 */
22d94f49 444 struct fscrypt_master_key_secret mk_secret;
23c688b5 445 struct rw_semaphore mk_secret_sem;
22d94f49 446
5dae460c
EB
447 /*
448 * For v1 policy keys: an arbitrary key descriptor which was assigned by
449 * userspace (->descriptor).
450 *
451 * For v2 policy keys: a cryptographic hash of this key (->identifier).
452 */
22d94f49
EB
453 struct fscrypt_key_specifier mk_spec;
454
23c688b5
EB
455 /*
456 * Keyring which contains a key of type 'key_type_fscrypt_user' for each
457 * user who has added this key. Normally each key will be added by just
458 * one user, but it's possible that multiple users share a key, and in
459 * that case we need to keep track of those users so that one user can't
460 * remove the key before the others want it removed too.
461 *
462 * This is NULL for v1 policy keys; those can only be added by root.
463 *
464 * Locking: in addition to this keyrings own semaphore, this is
465 * protected by the master key's key->sem, so we can do atomic
466 * search+insert. It can also be searched without taking any locks, but
467 * in that case the returned key may have already been removed.
468 */
469 struct key *mk_users;
470
b1c0ec35
EB
471 /*
472 * Length of ->mk_decrypted_inodes, plus one if mk_secret is present.
473 * Once this goes to 0, the master key is removed from ->s_master_keys.
474 * The 'struct fscrypt_master_key' will continue to live as long as the
475 * 'struct key' whose payload it is, but we won't let this reference
476 * count rise again.
477 */
478 refcount_t mk_refcount;
479
480 /*
481 * List of inodes that were unlocked using this key. This allows the
482 * inodes to be evicted efficiently if the key is removed.
483 */
484 struct list_head mk_decrypted_inodes;
485 spinlock_t mk_decrypted_inodes_lock;
486
b103fb76 487 /*
e3b1078b
EB
488 * Per-mode encryption keys for the various types of encryption policies
489 * that use them. Allocated and derived on-demand.
b103fb76 490 */
5fee3609
ST
491 struct fscrypt_prepared_key mk_direct_keys[__FSCRYPT_MODE_MAX + 1];
492 struct fscrypt_prepared_key mk_iv_ino_lblk_64_keys[__FSCRYPT_MODE_MAX + 1];
493 struct fscrypt_prepared_key mk_iv_ino_lblk_32_keys[__FSCRYPT_MODE_MAX + 1];
e3b1078b
EB
494
495 /* Hash key for inode numbers. Initialized only when needed. */
496 siphash_key_t mk_ino_hash_key;
497 bool mk_ino_hash_key_initialized;
5dae460c 498
22d94f49
EB
499} __randomize_layout;
500
b1c0ec35
EB
501static inline bool
502is_master_key_secret_present(const struct fscrypt_master_key_secret *secret)
503{
504 /*
505 * The READ_ONCE() is only necessary for fscrypt_drop_inode() and
506 * fscrypt_key_describe(). These run in atomic context, so they can't
23c688b5
EB
507 * take ->mk_secret_sem and thus 'secret' can change concurrently which
508 * would be a data race. But they only need to know whether the secret
509 * *was* present at the time of check, so READ_ONCE() suffices.
b1c0ec35
EB
510 */
511 return READ_ONCE(secret->size) != 0;
512}
513
22d94f49
EB
514static inline const char *master_key_spec_type(
515 const struct fscrypt_key_specifier *spec)
516{
517 switch (spec->type) {
518 case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
519 return "descriptor";
5dae460c
EB
520 case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
521 return "identifier";
22d94f49
EB
522 }
523 return "[unknown]";
524}
525
526static inline int master_key_spec_len(const struct fscrypt_key_specifier *spec)
527{
528 switch (spec->type) {
529 case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
530 return FSCRYPT_KEY_DESCRIPTOR_SIZE;
5dae460c
EB
531 case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
532 return FSCRYPT_KEY_IDENTIFIER_SIZE;
22d94f49
EB
533 }
534 return 0;
535}
536
60700902 537struct key *
22d94f49
EB
538fscrypt_find_master_key(struct super_block *sb,
539 const struct fscrypt_key_specifier *mk_spec);
540
cdeb21da
EB
541int fscrypt_add_test_dummy_key(struct super_block *sb,
542 struct fscrypt_key_specifier *key_spec);
543
60700902
EB
544int fscrypt_verify_key_added(struct super_block *sb,
545 const u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]);
5ab7189a 546
60700902 547int __init fscrypt_init_keyring(void);
22d94f49 548
feed8258 549/* keysetup.c */
8094c3ce
EB
550
551struct fscrypt_mode {
552 const char *friendly_name;
553 const char *cipher_str;
554 int keysize;
555 int ivsize;
ff73c2c0 556 int logged_impl_name;
5fee3609 557 enum blk_crypto_mode_num blk_crypto_mode;
8094c3ce
EB
558};
559
85af90e5 560extern struct fscrypt_mode fscrypt_modes[];
3ec4f2a6 561
5fee3609
ST
562int fscrypt_prepare_key(struct fscrypt_prepared_key *prep_key,
563 const u8 *raw_key, const struct fscrypt_info *ci);
564
565void fscrypt_destroy_prepared_key(struct fscrypt_prepared_key *prep_key);
0109ce76 566
60700902 567int fscrypt_set_per_file_enc_key(struct fscrypt_info *ci, const u8 *raw_key);
0109ce76 568
60700902
EB
569int fscrypt_derive_dirhash_key(struct fscrypt_info *ci,
570 const struct fscrypt_master_key *mk);
aa408f83 571
0109ce76
EB
572/* keysetup_v1.c */
573
60700902 574void fscrypt_put_direct_key(struct fscrypt_direct_key *dk);
0109ce76 575
60700902
EB
576int fscrypt_setup_v1_file_key(struct fscrypt_info *ci,
577 const u8 *raw_master_key);
578
579int fscrypt_setup_v1_file_key_via_subscribed_keyrings(struct fscrypt_info *ci);
0109ce76 580
5dae460c
EB
581/* policy.c */
582
60700902
EB
583bool fscrypt_policies_equal(const union fscrypt_policy *policy1,
584 const union fscrypt_policy *policy2);
585bool fscrypt_supported_policy(const union fscrypt_policy *policy_u,
586 const struct inode *inode);
587int fscrypt_policy_from_context(union fscrypt_policy *policy_u,
588 const union fscrypt_context *ctx_u,
589 int ctx_size);
0109ce76 590
3325bea5 591#endif /* _FSCRYPT_PRIVATE_H */