xref: /openbmc/linux/fs/crypto/fscrypt_private.h (revision 5dae460c2292dbbdac3a7a982cd566f470d957a2)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
23325bea5STheodore Ts'o /*
33325bea5STheodore Ts'o  * fscrypt_private.h
43325bea5STheodore Ts'o  *
53325bea5STheodore Ts'o  * Copyright (C) 2015, Google, Inc.
63325bea5STheodore Ts'o  *
73ec4f2a6SEric Biggers  * Originally written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar.
83ec4f2a6SEric Biggers  * Heavily modified since then.
93325bea5STheodore Ts'o  */
103325bea5STheodore Ts'o 
113325bea5STheodore Ts'o #ifndef _FSCRYPT_PRIVATE_H
123325bea5STheodore Ts'o #define _FSCRYPT_PRIVATE_H
133325bea5STheodore Ts'o 
14734f0d24SDave Chinner #include <linux/fscrypt.h>
15b7e7cf7aSDaniel Walter #include <crypto/hash.h>
163325bea5STheodore Ts'o 
1722d94f49SEric Biggers #define CONST_STRLEN(str)	(sizeof(str) - 1)
1822d94f49SEric Biggers 
19cc4e0df0STheodore Ts'o #define FS_KEY_DERIVATION_NONCE_SIZE	16
20cc4e0df0STheodore Ts'o 
2122d94f49SEric Biggers #define FSCRYPT_MIN_KEY_SIZE		16
2222d94f49SEric Biggers 
23*5dae460cSEric Biggers #define FSCRYPT_CONTEXT_V1	1
24*5dae460cSEric Biggers #define FSCRYPT_CONTEXT_V2	2
25*5dae460cSEric Biggers 
26*5dae460cSEric Biggers struct fscrypt_context_v1 {
27*5dae460cSEric Biggers 	u8 version; /* FSCRYPT_CONTEXT_V1 */
28cc4e0df0STheodore Ts'o 	u8 contents_encryption_mode;
29cc4e0df0STheodore Ts'o 	u8 filenames_encryption_mode;
30cc4e0df0STheodore Ts'o 	u8 flags;
313b6df59bSEric Biggers 	u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
32cc4e0df0STheodore Ts'o 	u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
33*5dae460cSEric Biggers };
34cc4e0df0STheodore Ts'o 
35*5dae460cSEric Biggers struct fscrypt_context_v2 {
36*5dae460cSEric Biggers 	u8 version; /* FSCRYPT_CONTEXT_V2 */
37*5dae460cSEric Biggers 	u8 contents_encryption_mode;
38*5dae460cSEric Biggers 	u8 filenames_encryption_mode;
39*5dae460cSEric Biggers 	u8 flags;
40*5dae460cSEric Biggers 	u8 __reserved[4];
41*5dae460cSEric Biggers 	u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
42*5dae460cSEric Biggers 	u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
43*5dae460cSEric Biggers };
44*5dae460cSEric Biggers 
45*5dae460cSEric Biggers /**
46*5dae460cSEric Biggers  * fscrypt_context - the encryption context of an inode
47*5dae460cSEric Biggers  *
48*5dae460cSEric Biggers  * This is the on-disk equivalent of an fscrypt_policy, stored alongside each
49*5dae460cSEric Biggers  * encrypted file usually in a hidden extended attribute.  It contains the
50*5dae460cSEric Biggers  * fields from the fscrypt_policy, in order to identify the encryption algorithm
51*5dae460cSEric Biggers  * and key with which the file is encrypted.  It also contains a nonce that was
52*5dae460cSEric Biggers  * randomly generated by fscrypt itself; this is used as KDF input or as a tweak
53*5dae460cSEric Biggers  * to cause different files to be encrypted differently.
54*5dae460cSEric Biggers  */
55*5dae460cSEric Biggers union fscrypt_context {
56*5dae460cSEric Biggers 	u8 version;
57*5dae460cSEric Biggers 	struct fscrypt_context_v1 v1;
58*5dae460cSEric Biggers 	struct fscrypt_context_v2 v2;
59*5dae460cSEric Biggers };
60*5dae460cSEric Biggers 
61*5dae460cSEric Biggers /*
62*5dae460cSEric Biggers  * Return the size expected for the given fscrypt_context based on its version
63*5dae460cSEric Biggers  * number, or 0 if the context version is unrecognized.
64*5dae460cSEric Biggers  */
65*5dae460cSEric Biggers static inline int fscrypt_context_size(const union fscrypt_context *ctx)
66*5dae460cSEric Biggers {
67*5dae460cSEric Biggers 	switch (ctx->version) {
68*5dae460cSEric Biggers 	case FSCRYPT_CONTEXT_V1:
69*5dae460cSEric Biggers 		BUILD_BUG_ON(sizeof(ctx->v1) != 28);
70*5dae460cSEric Biggers 		return sizeof(ctx->v1);
71*5dae460cSEric Biggers 	case FSCRYPT_CONTEXT_V2:
72*5dae460cSEric Biggers 		BUILD_BUG_ON(sizeof(ctx->v2) != 40);
73*5dae460cSEric Biggers 		return sizeof(ctx->v2);
74*5dae460cSEric Biggers 	}
75*5dae460cSEric Biggers 	return 0;
76*5dae460cSEric Biggers }
77*5dae460cSEric Biggers 
78*5dae460cSEric Biggers #undef fscrypt_policy
79*5dae460cSEric Biggers union fscrypt_policy {
80*5dae460cSEric Biggers 	u8 version;
81*5dae460cSEric Biggers 	struct fscrypt_policy_v1 v1;
82*5dae460cSEric Biggers 	struct fscrypt_policy_v2 v2;
83*5dae460cSEric Biggers };
84*5dae460cSEric Biggers 
85*5dae460cSEric Biggers /*
86*5dae460cSEric Biggers  * Return the size expected for the given fscrypt_policy based on its version
87*5dae460cSEric Biggers  * number, or 0 if the policy version is unrecognized.
88*5dae460cSEric Biggers  */
89*5dae460cSEric Biggers static inline int fscrypt_policy_size(const union fscrypt_policy *policy)
90*5dae460cSEric Biggers {
91*5dae460cSEric Biggers 	switch (policy->version) {
92*5dae460cSEric Biggers 	case FSCRYPT_POLICY_V1:
93*5dae460cSEric Biggers 		return sizeof(policy->v1);
94*5dae460cSEric Biggers 	case FSCRYPT_POLICY_V2:
95*5dae460cSEric Biggers 		return sizeof(policy->v2);
96*5dae460cSEric Biggers 	}
97*5dae460cSEric Biggers 	return 0;
98*5dae460cSEric Biggers }
99*5dae460cSEric Biggers 
100*5dae460cSEric Biggers /* Return the contents encryption mode of a valid encryption policy */
101*5dae460cSEric Biggers static inline u8
102*5dae460cSEric Biggers fscrypt_policy_contents_mode(const union fscrypt_policy *policy)
103*5dae460cSEric Biggers {
104*5dae460cSEric Biggers 	switch (policy->version) {
105*5dae460cSEric Biggers 	case FSCRYPT_POLICY_V1:
106*5dae460cSEric Biggers 		return policy->v1.contents_encryption_mode;
107*5dae460cSEric Biggers 	case FSCRYPT_POLICY_V2:
108*5dae460cSEric Biggers 		return policy->v2.contents_encryption_mode;
109*5dae460cSEric Biggers 	}
110*5dae460cSEric Biggers 	BUG();
111*5dae460cSEric Biggers }
112*5dae460cSEric Biggers 
113*5dae460cSEric Biggers /* Return the filenames encryption mode of a valid encryption policy */
114*5dae460cSEric Biggers static inline u8
115*5dae460cSEric Biggers fscrypt_policy_fnames_mode(const union fscrypt_policy *policy)
116*5dae460cSEric Biggers {
117*5dae460cSEric Biggers 	switch (policy->version) {
118*5dae460cSEric Biggers 	case FSCRYPT_POLICY_V1:
119*5dae460cSEric Biggers 		return policy->v1.filenames_encryption_mode;
120*5dae460cSEric Biggers 	case FSCRYPT_POLICY_V2:
121*5dae460cSEric Biggers 		return policy->v2.filenames_encryption_mode;
122*5dae460cSEric Biggers 	}
123*5dae460cSEric Biggers 	BUG();
124*5dae460cSEric Biggers }
125*5dae460cSEric Biggers 
126*5dae460cSEric Biggers /* Return the flags (FSCRYPT_POLICY_FLAG*) of a valid encryption policy */
127*5dae460cSEric Biggers static inline u8
128*5dae460cSEric Biggers fscrypt_policy_flags(const union fscrypt_policy *policy)
129*5dae460cSEric Biggers {
130*5dae460cSEric Biggers 	switch (policy->version) {
131*5dae460cSEric Biggers 	case FSCRYPT_POLICY_V1:
132*5dae460cSEric Biggers 		return policy->v1.flags;
133*5dae460cSEric Biggers 	case FSCRYPT_POLICY_V2:
134*5dae460cSEric Biggers 		return policy->v2.flags;
135*5dae460cSEric Biggers 	}
136*5dae460cSEric Biggers 	BUG();
137*5dae460cSEric Biggers }
138*5dae460cSEric Biggers 
139*5dae460cSEric Biggers static inline bool
140*5dae460cSEric Biggers fscrypt_is_direct_key_policy(const union fscrypt_policy *policy)
141*5dae460cSEric Biggers {
142*5dae460cSEric Biggers 	return fscrypt_policy_flags(policy) & FSCRYPT_POLICY_FLAG_DIRECT_KEY;
143*5dae460cSEric Biggers }
144cc4e0df0STheodore Ts'o 
1450eaab5b1SEric Biggers /**
1460eaab5b1SEric Biggers  * For encrypted symlinks, the ciphertext length is stored at the beginning
1470eaab5b1SEric Biggers  * of the string in little-endian format.
1480eaab5b1SEric Biggers  */
1490eaab5b1SEric Biggers struct fscrypt_symlink_data {
1500eaab5b1SEric Biggers 	__le16 len;
1510eaab5b1SEric Biggers 	char encrypted_path[1];
1520eaab5b1SEric Biggers } __packed;
1530eaab5b1SEric Biggers 
154cc4e0df0STheodore Ts'o /*
1558094c3ceSEric Biggers  * fscrypt_info - the "encryption key" for an inode
1568094c3ceSEric Biggers  *
1578094c3ceSEric Biggers  * When an encrypted file's key is made available, an instance of this struct is
1588094c3ceSEric Biggers  * allocated and stored in ->i_crypt_info.  Once created, it remains until the
1598094c3ceSEric Biggers  * inode is evicted.
160cc4e0df0STheodore Ts'o  */
161cc4e0df0STheodore Ts'o struct fscrypt_info {
1628094c3ceSEric Biggers 
1638094c3ceSEric Biggers 	/* The actual crypto transform used for encryption and decryption */
1648094c3ceSEric Biggers 	struct crypto_skcipher *ci_ctfm;
1658094c3ceSEric Biggers 
1668094c3ceSEric Biggers 	/*
1678094c3ceSEric Biggers 	 * Cipher for ESSIV IV generation.  Only set for CBC contents
1688094c3ceSEric Biggers 	 * encryption, otherwise is NULL.
1698094c3ceSEric Biggers 	 */
1708094c3ceSEric Biggers 	struct crypto_cipher *ci_essiv_tfm;
1718094c3ceSEric Biggers 
1728094c3ceSEric Biggers 	/*
173*5dae460cSEric Biggers 	 * Encryption mode used for this inode.  It corresponds to either the
174*5dae460cSEric Biggers 	 * contents or filenames encryption mode, depending on the inode type.
1758094c3ceSEric Biggers 	 */
1768094c3ceSEric Biggers 	struct fscrypt_mode *ci_mode;
1778094c3ceSEric Biggers 
17859dc6a8eSEric Biggers 	/* Back-pointer to the inode */
17959dc6a8eSEric Biggers 	struct inode *ci_inode;
18059dc6a8eSEric Biggers 
1818094c3ceSEric Biggers 	/*
182b1c0ec35SEric Biggers 	 * The master key with which this inode was unlocked (decrypted).  This
183b1c0ec35SEric Biggers 	 * will be NULL if the master key was found in a process-subscribed
184b1c0ec35SEric Biggers 	 * keyring rather than in the filesystem-level keyring.
185b1c0ec35SEric Biggers 	 */
186b1c0ec35SEric Biggers 	struct key *ci_master_key;
187b1c0ec35SEric Biggers 
188b1c0ec35SEric Biggers 	/*
189b1c0ec35SEric Biggers 	 * Link in list of inodes that were unlocked with the master key.
190b1c0ec35SEric Biggers 	 * Only used when ->ci_master_key is set.
191b1c0ec35SEric Biggers 	 */
192b1c0ec35SEric Biggers 	struct list_head ci_master_key_link;
193b1c0ec35SEric Biggers 
194b1c0ec35SEric Biggers 	/*
195a828daabSEric Biggers 	 * If non-NULL, then encryption is done using the master key directly
196a828daabSEric Biggers 	 * and ci_ctfm will equal ci_direct_key->dk_ctfm.
1978094c3ceSEric Biggers 	 */
198a828daabSEric Biggers 	struct fscrypt_direct_key *ci_direct_key;
1998094c3ceSEric Biggers 
200*5dae460cSEric Biggers 	/* The encryption policy used by this inode */
201*5dae460cSEric Biggers 	union fscrypt_policy ci_policy;
202*5dae460cSEric Biggers 
203*5dae460cSEric Biggers 	/* This inode's nonce, copied from the fscrypt_context */
2048094c3ceSEric Biggers 	u8 ci_nonce[FS_KEY_DERIVATION_NONCE_SIZE];
205cc4e0df0STheodore Ts'o };
206cc4e0df0STheodore Ts'o 
20758ae7468SRichard Weinberger typedef enum {
20858ae7468SRichard Weinberger 	FS_DECRYPT = 0,
20958ae7468SRichard Weinberger 	FS_ENCRYPT,
21058ae7468SRichard Weinberger } fscrypt_direction_t;
21158ae7468SRichard Weinberger 
212cc4e0df0STheodore Ts'o #define FS_CTX_REQUIRES_FREE_ENCRYPT_FL		0x00000001
213cc4e0df0STheodore Ts'o 
214bb8179e5SEric Biggers static inline bool fscrypt_valid_enc_modes(u32 contents_mode,
215bb8179e5SEric Biggers 					   u32 filenames_mode)
216bb8179e5SEric Biggers {
2173b6df59bSEric Biggers 	if (contents_mode == FSCRYPT_MODE_AES_128_CBC &&
2183b6df59bSEric Biggers 	    filenames_mode == FSCRYPT_MODE_AES_128_CTS)
219bb8179e5SEric Biggers 		return true;
220bb8179e5SEric Biggers 
2213b6df59bSEric Biggers 	if (contents_mode == FSCRYPT_MODE_AES_256_XTS &&
2223b6df59bSEric Biggers 	    filenames_mode == FSCRYPT_MODE_AES_256_CTS)
223bb8179e5SEric Biggers 		return true;
224bb8179e5SEric Biggers 
2253b6df59bSEric Biggers 	if (contents_mode == FSCRYPT_MODE_ADIANTUM &&
2263b6df59bSEric Biggers 	    filenames_mode == FSCRYPT_MODE_ADIANTUM)
2278094c3ceSEric Biggers 		return true;
2288094c3ceSEric Biggers 
229bb8179e5SEric Biggers 	return false;
230bb8179e5SEric Biggers }
231bb8179e5SEric Biggers 
232b98701dfSTheodore Ts'o /* crypto.c */
233e4de782aSEric Biggers extern struct kmem_cache *fscrypt_info_cachep;
23458ae7468SRichard Weinberger extern int fscrypt_initialize(unsigned int cop_flags);
235f47fcbb2SEric Biggers extern int fscrypt_crypt_block(const struct inode *inode,
23658ae7468SRichard Weinberger 			       fscrypt_direction_t rw, u64 lblk_num,
237f47fcbb2SEric Biggers 			       struct page *src_page, struct page *dest_page,
23858ae7468SRichard Weinberger 			       unsigned int len, unsigned int offs,
23958ae7468SRichard Weinberger 			       gfp_t gfp_flags);
240d2d0727bSEric Biggers extern struct page *fscrypt_alloc_bounce_page(gfp_t gfp_flags);
24154222025SEric Biggers extern const struct dentry_operations fscrypt_d_ops;
242b98701dfSTheodore Ts'o 
243544d08fdSEric Biggers extern void __printf(3, 4) __cold
244886da8b3SEric Biggers fscrypt_msg(const struct inode *inode, const char *level, const char *fmt, ...);
245544d08fdSEric Biggers 
246886da8b3SEric Biggers #define fscrypt_warn(inode, fmt, ...)		\
247886da8b3SEric Biggers 	fscrypt_msg((inode), KERN_WARNING, fmt, ##__VA_ARGS__)
248886da8b3SEric Biggers #define fscrypt_err(inode, fmt, ...)		\
249886da8b3SEric Biggers 	fscrypt_msg((inode), KERN_ERR, fmt, ##__VA_ARGS__)
250544d08fdSEric Biggers 
2518094c3ceSEric Biggers #define FSCRYPT_MAX_IV_SIZE	32
2528094c3ceSEric Biggers 
2538094c3ceSEric Biggers union fscrypt_iv {
2548094c3ceSEric Biggers 	struct {
2558094c3ceSEric Biggers 		/* logical block number within the file */
2568094c3ceSEric Biggers 		__le64 lblk_num;
2578094c3ceSEric Biggers 
2588094c3ceSEric Biggers 		/* per-file nonce; only set in DIRECT_KEY mode */
2598094c3ceSEric Biggers 		u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
2608094c3ceSEric Biggers 	};
2618094c3ceSEric Biggers 	u8 raw[FSCRYPT_MAX_IV_SIZE];
2628094c3ceSEric Biggers };
2638094c3ceSEric Biggers 
2648094c3ceSEric Biggers void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num,
2658094c3ceSEric Biggers 			 const struct fscrypt_info *ci);
2668094c3ceSEric Biggers 
26776e81d6dSEric Biggers /* fname.c */
26850c961deSEric Biggers extern int fname_encrypt(struct inode *inode, const struct qstr *iname,
26950c961deSEric Biggers 			 u8 *out, unsigned int olen);
270b9db0b4aSEric Biggers extern bool fscrypt_fname_encrypted_size(const struct inode *inode,
271b9db0b4aSEric Biggers 					 u32 orig_len, u32 max_len,
272b9db0b4aSEric Biggers 					 u32 *encrypted_len_ret);
27376e81d6dSEric Biggers 
274c1144c9bSEric Biggers /* hkdf.c */
275c1144c9bSEric Biggers 
276c1144c9bSEric Biggers struct fscrypt_hkdf {
277c1144c9bSEric Biggers 	struct crypto_shash *hmac_tfm;
278c1144c9bSEric Biggers };
279c1144c9bSEric Biggers 
280c1144c9bSEric Biggers extern int fscrypt_init_hkdf(struct fscrypt_hkdf *hkdf, const u8 *master_key,
281c1144c9bSEric Biggers 			     unsigned int master_key_size);
282c1144c9bSEric Biggers 
283*5dae460cSEric Biggers /*
284*5dae460cSEric Biggers  * The list of contexts in which fscrypt uses HKDF.  These values are used as
285*5dae460cSEric Biggers  * the first byte of the HKDF application-specific info string to guarantee that
286*5dae460cSEric Biggers  * info strings are never repeated between contexts.  This ensures that all HKDF
287*5dae460cSEric Biggers  * outputs are unique and cryptographically isolated, i.e. knowledge of one
288*5dae460cSEric Biggers  * output doesn't reveal another.
289*5dae460cSEric Biggers  */
290*5dae460cSEric Biggers #define HKDF_CONTEXT_KEY_IDENTIFIER	1
291*5dae460cSEric Biggers #define HKDF_CONTEXT_PER_FILE_KEY	2
292*5dae460cSEric Biggers #define HKDF_CONTEXT_PER_MODE_KEY	3
293*5dae460cSEric Biggers 
294c1144c9bSEric Biggers extern int fscrypt_hkdf_expand(struct fscrypt_hkdf *hkdf, u8 context,
295c1144c9bSEric Biggers 			       const u8 *info, unsigned int infolen,
296c1144c9bSEric Biggers 			       u8 *okm, unsigned int okmlen);
297c1144c9bSEric Biggers 
298c1144c9bSEric Biggers extern void fscrypt_destroy_hkdf(struct fscrypt_hkdf *hkdf);
299c1144c9bSEric Biggers 
30022d94f49SEric Biggers /* keyring.c */
30122d94f49SEric Biggers 
30222d94f49SEric Biggers /*
30322d94f49SEric Biggers  * fscrypt_master_key_secret - secret key material of an in-use master key
30422d94f49SEric Biggers  */
30522d94f49SEric Biggers struct fscrypt_master_key_secret {
30622d94f49SEric Biggers 
307*5dae460cSEric Biggers 	/*
308*5dae460cSEric Biggers 	 * For v2 policy keys: HKDF context keyed by this master key.
309*5dae460cSEric Biggers 	 * For v1 policy keys: not set (hkdf.hmac_tfm == NULL).
310*5dae460cSEric Biggers 	 */
311*5dae460cSEric Biggers 	struct fscrypt_hkdf	hkdf;
312*5dae460cSEric Biggers 
313*5dae460cSEric Biggers 	/* Size of the raw key in bytes.  Set even if ->raw isn't set. */
31422d94f49SEric Biggers 	u32			size;
31522d94f49SEric Biggers 
316*5dae460cSEric Biggers 	/* For v1 policy keys: the raw key.  Wiped for v2 policy keys. */
31722d94f49SEric Biggers 	u8			raw[FSCRYPT_MAX_KEY_SIZE];
31822d94f49SEric Biggers 
31922d94f49SEric Biggers } __randomize_layout;
32022d94f49SEric Biggers 
32122d94f49SEric Biggers /*
32222d94f49SEric Biggers  * fscrypt_master_key - an in-use master key
32322d94f49SEric Biggers  *
32422d94f49SEric Biggers  * This represents a master encryption key which has been added to the
32522d94f49SEric Biggers  * filesystem and can be used to "unlock" the encrypted files which were
32622d94f49SEric Biggers  * encrypted with it.
32722d94f49SEric Biggers  */
32822d94f49SEric Biggers struct fscrypt_master_key {
32922d94f49SEric Biggers 
330b1c0ec35SEric Biggers 	/*
331b1c0ec35SEric Biggers 	 * The secret key material.  After FS_IOC_REMOVE_ENCRYPTION_KEY is
332b1c0ec35SEric Biggers 	 * executed, this is wiped and no new inodes can be unlocked with this
333b1c0ec35SEric Biggers 	 * key; however, there may still be inodes in ->mk_decrypted_inodes
334b1c0ec35SEric Biggers 	 * which could not be evicted.  As long as some inodes still remain,
335b1c0ec35SEric Biggers 	 * FS_IOC_REMOVE_ENCRYPTION_KEY can be retried, or
336b1c0ec35SEric Biggers 	 * FS_IOC_ADD_ENCRYPTION_KEY can add the secret again.
337b1c0ec35SEric Biggers 	 *
338b1c0ec35SEric Biggers 	 * Locking: protected by key->sem.
339b1c0ec35SEric Biggers 	 */
34022d94f49SEric Biggers 	struct fscrypt_master_key_secret	mk_secret;
34122d94f49SEric Biggers 
342*5dae460cSEric Biggers 	/*
343*5dae460cSEric Biggers 	 * For v1 policy keys: an arbitrary key descriptor which was assigned by
344*5dae460cSEric Biggers 	 * userspace (->descriptor).
345*5dae460cSEric Biggers 	 *
346*5dae460cSEric Biggers 	 * For v2 policy keys: a cryptographic hash of this key (->identifier).
347*5dae460cSEric Biggers 	 */
34822d94f49SEric Biggers 	struct fscrypt_key_specifier		mk_spec;
34922d94f49SEric Biggers 
350b1c0ec35SEric Biggers 	/*
351b1c0ec35SEric Biggers 	 * Length of ->mk_decrypted_inodes, plus one if mk_secret is present.
352b1c0ec35SEric Biggers 	 * Once this goes to 0, the master key is removed from ->s_master_keys.
353b1c0ec35SEric Biggers 	 * The 'struct fscrypt_master_key' will continue to live as long as the
354b1c0ec35SEric Biggers 	 * 'struct key' whose payload it is, but we won't let this reference
355b1c0ec35SEric Biggers 	 * count rise again.
356b1c0ec35SEric Biggers 	 */
357b1c0ec35SEric Biggers 	refcount_t		mk_refcount;
358b1c0ec35SEric Biggers 
359b1c0ec35SEric Biggers 	/*
360b1c0ec35SEric Biggers 	 * List of inodes that were unlocked using this key.  This allows the
361b1c0ec35SEric Biggers 	 * inodes to be evicted efficiently if the key is removed.
362b1c0ec35SEric Biggers 	 */
363b1c0ec35SEric Biggers 	struct list_head	mk_decrypted_inodes;
364b1c0ec35SEric Biggers 	spinlock_t		mk_decrypted_inodes_lock;
365b1c0ec35SEric Biggers 
366*5dae460cSEric Biggers 	/* Per-mode tfms for DIRECT_KEY policies, allocated on-demand */
367*5dae460cSEric Biggers 	struct crypto_skcipher	*mk_mode_keys[__FSCRYPT_MODE_MAX + 1];
368*5dae460cSEric Biggers 
36922d94f49SEric Biggers } __randomize_layout;
37022d94f49SEric Biggers 
371b1c0ec35SEric Biggers static inline bool
372b1c0ec35SEric Biggers is_master_key_secret_present(const struct fscrypt_master_key_secret *secret)
373b1c0ec35SEric Biggers {
374b1c0ec35SEric Biggers 	/*
375b1c0ec35SEric Biggers 	 * The READ_ONCE() is only necessary for fscrypt_drop_inode() and
376b1c0ec35SEric Biggers 	 * fscrypt_key_describe().  These run in atomic context, so they can't
377b1c0ec35SEric Biggers 	 * take key->sem and thus 'secret' can change concurrently which would
378b1c0ec35SEric Biggers 	 * be a data race.  But they only need to know whether the secret *was*
379b1c0ec35SEric Biggers 	 * present at the time of check, so READ_ONCE() suffices.
380b1c0ec35SEric Biggers 	 */
381b1c0ec35SEric Biggers 	return READ_ONCE(secret->size) != 0;
382b1c0ec35SEric Biggers }
383b1c0ec35SEric Biggers 
38422d94f49SEric Biggers static inline const char *master_key_spec_type(
38522d94f49SEric Biggers 				const struct fscrypt_key_specifier *spec)
38622d94f49SEric Biggers {
38722d94f49SEric Biggers 	switch (spec->type) {
38822d94f49SEric Biggers 	case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
38922d94f49SEric Biggers 		return "descriptor";
390*5dae460cSEric Biggers 	case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
391*5dae460cSEric Biggers 		return "identifier";
39222d94f49SEric Biggers 	}
39322d94f49SEric Biggers 	return "[unknown]";
39422d94f49SEric Biggers }
39522d94f49SEric Biggers 
39622d94f49SEric Biggers static inline int master_key_spec_len(const struct fscrypt_key_specifier *spec)
39722d94f49SEric Biggers {
39822d94f49SEric Biggers 	switch (spec->type) {
39922d94f49SEric Biggers 	case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
40022d94f49SEric Biggers 		return FSCRYPT_KEY_DESCRIPTOR_SIZE;
401*5dae460cSEric Biggers 	case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
402*5dae460cSEric Biggers 		return FSCRYPT_KEY_IDENTIFIER_SIZE;
40322d94f49SEric Biggers 	}
40422d94f49SEric Biggers 	return 0;
40522d94f49SEric Biggers }
40622d94f49SEric Biggers 
40722d94f49SEric Biggers extern struct key *
40822d94f49SEric Biggers fscrypt_find_master_key(struct super_block *sb,
40922d94f49SEric Biggers 			const struct fscrypt_key_specifier *mk_spec);
41022d94f49SEric Biggers 
41122d94f49SEric Biggers extern int __init fscrypt_init_keyring(void);
41222d94f49SEric Biggers 
413feed8258SEric Biggers /* keysetup.c */
4148094c3ceSEric Biggers 
4158094c3ceSEric Biggers struct fscrypt_mode {
4168094c3ceSEric Biggers 	const char *friendly_name;
4178094c3ceSEric Biggers 	const char *cipher_str;
4188094c3ceSEric Biggers 	int keysize;
4198094c3ceSEric Biggers 	int ivsize;
4208094c3ceSEric Biggers 	bool logged_impl_name;
4218094c3ceSEric Biggers 	bool needs_essiv;
4228094c3ceSEric Biggers };
4238094c3ceSEric Biggers 
4243ec4f2a6SEric Biggers static inline bool
4253ec4f2a6SEric Biggers fscrypt_mode_supports_direct_key(const struct fscrypt_mode *mode)
4263ec4f2a6SEric Biggers {
4273ec4f2a6SEric Biggers 	return mode->ivsize >= offsetofend(union fscrypt_iv, nonce);
4283ec4f2a6SEric Biggers }
4293ec4f2a6SEric Biggers 
4300109ce76SEric Biggers extern struct crypto_skcipher *
4310109ce76SEric Biggers fscrypt_allocate_skcipher(struct fscrypt_mode *mode, const u8 *raw_key,
4320109ce76SEric Biggers 			  const struct inode *inode);
4330109ce76SEric Biggers 
4340109ce76SEric Biggers extern int fscrypt_set_derived_key(struct fscrypt_info *ci,
4350109ce76SEric Biggers 				   const u8 *derived_key);
4360109ce76SEric Biggers 
4370109ce76SEric Biggers /* keysetup_v1.c */
4380109ce76SEric Biggers 
4390109ce76SEric Biggers extern void fscrypt_put_direct_key(struct fscrypt_direct_key *dk);
4400109ce76SEric Biggers 
4410109ce76SEric Biggers extern int fscrypt_setup_v1_file_key(struct fscrypt_info *ci,
4420109ce76SEric Biggers 				     const u8 *raw_master_key);
4430109ce76SEric Biggers 
4440109ce76SEric Biggers extern int fscrypt_setup_v1_file_key_via_subscribed_keyrings(
4450109ce76SEric Biggers 					struct fscrypt_info *ci);
446*5dae460cSEric Biggers /* policy.c */
447*5dae460cSEric Biggers 
448*5dae460cSEric Biggers extern bool fscrypt_policies_equal(const union fscrypt_policy *policy1,
449*5dae460cSEric Biggers 				   const union fscrypt_policy *policy2);
450*5dae460cSEric Biggers extern bool fscrypt_supported_policy(const union fscrypt_policy *policy_u,
451*5dae460cSEric Biggers 				     const struct inode *inode);
452*5dae460cSEric Biggers extern int fscrypt_policy_from_context(union fscrypt_policy *policy_u,
453*5dae460cSEric Biggers 				       const union fscrypt_context *ctx_u,
454*5dae460cSEric Biggers 				       int ctx_size);
4550109ce76SEric Biggers 
4563325bea5STheodore Ts'o #endif /* _FSCRYPT_PRIVATE_H */
457