This source file includes following definitions.
- fscrypt_context_size
- fscrypt_policy_size
- fscrypt_policy_contents_mode
- fscrypt_policy_fnames_mode
- fscrypt_policy_flags
- fscrypt_is_direct_key_policy
- fscrypt_valid_enc_modes
- is_master_key_secret_present
- master_key_spec_type
- master_key_spec_len
- fscrypt_mode_supports_direct_key
1
2
3
4
5
6
7
8
9
10
11 #ifndef _FSCRYPT_PRIVATE_H
12 #define _FSCRYPT_PRIVATE_H
13
14 #include <linux/fscrypt.h>
15 #include <crypto/hash.h>
16
17 #define CONST_STRLEN(str) (sizeof(str) - 1)
18
19 #define FS_KEY_DERIVATION_NONCE_SIZE 16
20
21 #define FSCRYPT_MIN_KEY_SIZE 16
22
23 #define FSCRYPT_CONTEXT_V1 1
24 #define FSCRYPT_CONTEXT_V2 2
25
26 struct fscrypt_context_v1 {
27 u8 version;
28 u8 contents_encryption_mode;
29 u8 filenames_encryption_mode;
30 u8 flags;
31 u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
32 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
33 };
34
35 struct fscrypt_context_v2 {
36 u8 version;
37 u8 contents_encryption_mode;
38 u8 filenames_encryption_mode;
39 u8 flags;
40 u8 __reserved[4];
41 u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
42 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
43 };
44
45
46
47
48
49
50
51
52
53
54
55 union fscrypt_context {
56 u8 version;
57 struct fscrypt_context_v1 v1;
58 struct fscrypt_context_v2 v2;
59 };
60
61
62
63
64
65 static inline int fscrypt_context_size(const union fscrypt_context *ctx)
66 {
67 switch (ctx->version) {
68 case FSCRYPT_CONTEXT_V1:
69 BUILD_BUG_ON(sizeof(ctx->v1) != 28);
70 return sizeof(ctx->v1);
71 case FSCRYPT_CONTEXT_V2:
72 BUILD_BUG_ON(sizeof(ctx->v2) != 40);
73 return sizeof(ctx->v2);
74 }
75 return 0;
76 }
77
78 #undef fscrypt_policy
79 union fscrypt_policy {
80 u8 version;
81 struct fscrypt_policy_v1 v1;
82 struct fscrypt_policy_v2 v2;
83 };
84
85
86
87
88
89 static inline int fscrypt_policy_size(const union fscrypt_policy *policy)
90 {
91 switch (policy->version) {
92 case FSCRYPT_POLICY_V1:
93 return sizeof(policy->v1);
94 case FSCRYPT_POLICY_V2:
95 return sizeof(policy->v2);
96 }
97 return 0;
98 }
99
100
101 static inline u8
102 fscrypt_policy_contents_mode(const union fscrypt_policy *policy)
103 {
104 switch (policy->version) {
105 case FSCRYPT_POLICY_V1:
106 return policy->v1.contents_encryption_mode;
107 case FSCRYPT_POLICY_V2:
108 return policy->v2.contents_encryption_mode;
109 }
110 BUG();
111 }
112
113
114 static inline u8
115 fscrypt_policy_fnames_mode(const union fscrypt_policy *policy)
116 {
117 switch (policy->version) {
118 case FSCRYPT_POLICY_V1:
119 return policy->v1.filenames_encryption_mode;
120 case FSCRYPT_POLICY_V2:
121 return policy->v2.filenames_encryption_mode;
122 }
123 BUG();
124 }
125
126
127 static inline u8
128 fscrypt_policy_flags(const union fscrypt_policy *policy)
129 {
130 switch (policy->version) {
131 case FSCRYPT_POLICY_V1:
132 return policy->v1.flags;
133 case FSCRYPT_POLICY_V2:
134 return policy->v2.flags;
135 }
136 BUG();
137 }
138
139 static inline bool
140 fscrypt_is_direct_key_policy(const union fscrypt_policy *policy)
141 {
142 return fscrypt_policy_flags(policy) & FSCRYPT_POLICY_FLAG_DIRECT_KEY;
143 }
144
145
146
147
148
149 struct fscrypt_symlink_data {
150 __le16 len;
151 char encrypted_path[1];
152 } __packed;
153
154
155
156
157
158
159
160
161 struct fscrypt_info {
162
163
164 struct crypto_skcipher *ci_ctfm;
165
166
167
168
169
170 struct crypto_cipher *ci_essiv_tfm;
171
172
173
174
175
176 struct fscrypt_mode *ci_mode;
177
178
179 struct inode *ci_inode;
180
181
182
183
184
185
186 struct key *ci_master_key;
187
188
189
190
191
192 struct list_head ci_master_key_link;
193
194
195
196
197
198 struct fscrypt_direct_key *ci_direct_key;
199
200
201 union fscrypt_policy ci_policy;
202
203
204 u8 ci_nonce[FS_KEY_DERIVATION_NONCE_SIZE];
205 };
206
207 typedef enum {
208 FS_DECRYPT = 0,
209 FS_ENCRYPT,
210 } fscrypt_direction_t;
211
212 #define FS_CTX_REQUIRES_FREE_ENCRYPT_FL 0x00000001
213
214 static inline bool fscrypt_valid_enc_modes(u32 contents_mode,
215 u32 filenames_mode)
216 {
217 if (contents_mode == FSCRYPT_MODE_AES_128_CBC &&
218 filenames_mode == FSCRYPT_MODE_AES_128_CTS)
219 return true;
220
221 if (contents_mode == FSCRYPT_MODE_AES_256_XTS &&
222 filenames_mode == FSCRYPT_MODE_AES_256_CTS)
223 return true;
224
225 if (contents_mode == FSCRYPT_MODE_ADIANTUM &&
226 filenames_mode == FSCRYPT_MODE_ADIANTUM)
227 return true;
228
229 return false;
230 }
231
232
233 extern struct kmem_cache *fscrypt_info_cachep;
234 extern int fscrypt_initialize(unsigned int cop_flags);
235 extern int fscrypt_crypt_block(const struct inode *inode,
236 fscrypt_direction_t rw, u64 lblk_num,
237 struct page *src_page, struct page *dest_page,
238 unsigned int len, unsigned int offs,
239 gfp_t gfp_flags);
240 extern struct page *fscrypt_alloc_bounce_page(gfp_t gfp_flags);
241 extern const struct dentry_operations fscrypt_d_ops;
242
243 extern void __printf(3, 4) __cold
244 fscrypt_msg(const struct inode *inode, const char *level, const char *fmt, ...);
245
246 #define fscrypt_warn(inode, fmt, ...) \
247 fscrypt_msg((inode), KERN_WARNING, fmt, ##__VA_ARGS__)
248 #define fscrypt_err(inode, fmt, ...) \
249 fscrypt_msg((inode), KERN_ERR, fmt, ##__VA_ARGS__)
250
251 #define FSCRYPT_MAX_IV_SIZE 32
252
253 union fscrypt_iv {
254 struct {
255
256 __le64 lblk_num;
257
258
259 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
260 };
261 u8 raw[FSCRYPT_MAX_IV_SIZE];
262 };
263
264 void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num,
265 const struct fscrypt_info *ci);
266
267
268 extern int fname_encrypt(struct inode *inode, const struct qstr *iname,
269 u8 *out, unsigned int olen);
270 extern bool fscrypt_fname_encrypted_size(const struct inode *inode,
271 u32 orig_len, u32 max_len,
272 u32 *encrypted_len_ret);
273
274
275
276 struct fscrypt_hkdf {
277 struct crypto_shash *hmac_tfm;
278 };
279
280 extern int fscrypt_init_hkdf(struct fscrypt_hkdf *hkdf, const u8 *master_key,
281 unsigned int master_key_size);
282
283
284
285
286
287
288
289
290 #define HKDF_CONTEXT_KEY_IDENTIFIER 1
291 #define HKDF_CONTEXT_PER_FILE_KEY 2
292 #define HKDF_CONTEXT_PER_MODE_KEY 3
293
294 extern int fscrypt_hkdf_expand(struct fscrypt_hkdf *hkdf, u8 context,
295 const u8 *info, unsigned int infolen,
296 u8 *okm, unsigned int okmlen);
297
298 extern void fscrypt_destroy_hkdf(struct fscrypt_hkdf *hkdf);
299
300
301
302
303
304
305 struct fscrypt_master_key_secret {
306
307
308
309
310
311 struct fscrypt_hkdf hkdf;
312
313
314 u32 size;
315
316
317 u8 raw[FSCRYPT_MAX_KEY_SIZE];
318
319 } __randomize_layout;
320
321
322
323
324
325
326
327
328 struct fscrypt_master_key {
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346 struct fscrypt_master_key_secret mk_secret;
347 struct rw_semaphore mk_secret_sem;
348
349
350
351
352
353
354
355 struct fscrypt_key_specifier mk_spec;
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371 struct key *mk_users;
372
373
374
375
376
377
378
379
380 refcount_t mk_refcount;
381
382
383
384
385
386 struct list_head mk_decrypted_inodes;
387 spinlock_t mk_decrypted_inodes_lock;
388
389
390 struct crypto_skcipher *mk_mode_keys[__FSCRYPT_MODE_MAX + 1];
391
392 } __randomize_layout;
393
394 static inline bool
395 is_master_key_secret_present(const struct fscrypt_master_key_secret *secret)
396 {
397
398
399
400
401
402
403
404 return READ_ONCE(secret->size) != 0;
405 }
406
407 static inline const char *master_key_spec_type(
408 const struct fscrypt_key_specifier *spec)
409 {
410 switch (spec->type) {
411 case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
412 return "descriptor";
413 case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
414 return "identifier";
415 }
416 return "[unknown]";
417 }
418
419 static inline int master_key_spec_len(const struct fscrypt_key_specifier *spec)
420 {
421 switch (spec->type) {
422 case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR:
423 return FSCRYPT_KEY_DESCRIPTOR_SIZE;
424 case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER:
425 return FSCRYPT_KEY_IDENTIFIER_SIZE;
426 }
427 return 0;
428 }
429
430 extern struct key *
431 fscrypt_find_master_key(struct super_block *sb,
432 const struct fscrypt_key_specifier *mk_spec);
433
434 extern int fscrypt_verify_key_added(struct super_block *sb,
435 const u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]);
436
437 extern int __init fscrypt_init_keyring(void);
438
439
440
441 struct fscrypt_mode {
442 const char *friendly_name;
443 const char *cipher_str;
444 int keysize;
445 int ivsize;
446 bool logged_impl_name;
447 bool needs_essiv;
448 };
449
450 static inline bool
451 fscrypt_mode_supports_direct_key(const struct fscrypt_mode *mode)
452 {
453 return mode->ivsize >= offsetofend(union fscrypt_iv, nonce);
454 }
455
456 extern struct crypto_skcipher *
457 fscrypt_allocate_skcipher(struct fscrypt_mode *mode, const u8 *raw_key,
458 const struct inode *inode);
459
460 extern int fscrypt_set_derived_key(struct fscrypt_info *ci,
461 const u8 *derived_key);
462
463
464
465 extern void fscrypt_put_direct_key(struct fscrypt_direct_key *dk);
466
467 extern int fscrypt_setup_v1_file_key(struct fscrypt_info *ci,
468 const u8 *raw_master_key);
469
470 extern int fscrypt_setup_v1_file_key_via_subscribed_keyrings(
471 struct fscrypt_info *ci);
472
473
474 extern bool fscrypt_policies_equal(const union fscrypt_policy *policy1,
475 const union fscrypt_policy *policy2);
476 extern bool fscrypt_supported_policy(const union fscrypt_policy *policy_u,
477 const struct inode *inode);
478 extern int fscrypt_policy_from_context(union fscrypt_policy *policy_u,
479 const union fscrypt_context *ctx_u,
480 int ctx_size);
481
482 #endif