blob: f06a8c01513904d9fd8b527d793f952d61ac4e84 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Theodore Ts'o3325bea2016-11-26 20:32:46 -05002/*
3 * fscrypt_private.h
4 *
5 * Copyright (C) 2015, Google, Inc.
6 *
7 * This contains encryption key functions.
8 *
9 * Written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar, 2015.
10 */
11
12#ifndef _FSCRYPT_PRIVATE_H
13#define _FSCRYPT_PRIVATE_H
14
Zhen Kongee7bdc62019-03-14 10:55:19 -070015#ifndef __FS_HAS_ENCRYPTION
Dave Chinner734f0d22017-10-09 12:15:34 -070016#define __FS_HAS_ENCRYPTION 1
Zhen Kongee7bdc62019-03-14 10:55:19 -070017#endif
Dave Chinner734f0d22017-10-09 12:15:34 -070018#include <linux/fscrypt.h>
Daniel Walterb7e7cf72017-06-19 09:27:58 +020019#include <crypto/hash.h>
Zhen Kongee7bdc62019-03-14 10:55:19 -070020#include <linux/pfk.h>
Theodore Ts'o3325bea2016-11-26 20:32:46 -050021
Theodore Ts'occ4e0df2016-11-26 22:05:18 -050022/* Encryption parameters */
Zhen Kongee7bdc62019-03-14 10:55:19 -070023
24#define FS_AES_128_ECB_KEY_SIZE 16
25#define FS_AES_128_CBC_KEY_SIZE 16
26#define FS_AES_128_CTS_KEY_SIZE 16
27#define FS_AES_256_GCM_KEY_SIZE 32
28#define FS_AES_256_CBC_KEY_SIZE 32
29#define FS_AES_256_CTS_KEY_SIZE 32
30#define FS_AES_256_XTS_KEY_SIZE 64
31
Eric Biggers11b88182018-04-30 15:51:46 -070032#define FS_KEY_DERIVATION_NONCE_SIZE 16
Theodore Ts'occ4e0df2016-11-26 22:05:18 -050033
34/**
35 * Encryption context for inode
36 *
37 * Protector format:
38 * 1 byte: Protector format (1 = this version)
39 * 1 byte: File contents encryption mode
40 * 1 byte: File names encryption mode
41 * 1 byte: Flags
42 * 8 bytes: Master Key descriptor
43 * 16 bytes: Encryption Key derivation nonce
44 */
45struct fscrypt_context {
46 u8 format;
47 u8 contents_encryption_mode;
48 u8 filenames_encryption_mode;
49 u8 flags;
50 u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
51 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
52} __packed;
53
54#define FS_ENCRYPTION_CONTEXT_FORMAT_V1 1
55
Eric Biggers0eaab5b2018-01-11 23:30:08 -050056/**
57 * For encrypted symlinks, the ciphertext length is stored at the beginning
58 * of the string in little-endian format.
59 */
60struct fscrypt_symlink_data {
61 __le16 len;
62 char encrypted_path[1];
63} __packed;
64
Theodore Ts'occ4e0df2016-11-26 22:05:18 -050065/*
Eric Biggers78d7a792018-11-26 11:27:37 -080066 * fscrypt_info - the "encryption key" for an inode
67 *
68 * When an encrypted file's key is made available, an instance of this struct is
69 * allocated and stored in ->i_crypt_info. Once created, it remains until the
70 * inode is evicted.
Theodore Ts'occ4e0df2016-11-26 22:05:18 -050071 */
72struct fscrypt_info {
Eric Biggers78d7a792018-11-26 11:27:37 -080073
74 /* The actual crypto transform used for encryption and decryption */
75 struct crypto_skcipher *ci_ctfm;
76
77 /*
78 * Cipher for ESSIV IV generation. Only set for CBC contents
79 * encryption, otherwise is NULL.
80 */
81 struct crypto_cipher *ci_essiv_tfm;
82
83 /*
84 * Encryption mode used for this inode. It corresponds to either
85 * ci_data_mode or ci_filename_mode, depending on the inode type.
86 */
87 struct fscrypt_mode *ci_mode;
88
89 /*
90 * If non-NULL, then this inode uses a master key directly rather than a
91 * derived key, and ci_ctfm will equal ci_master_key->mk_ctfm.
92 * Otherwise, this inode uses a derived key.
93 */
94 struct fscrypt_master_key *ci_master_key;
95
96 /* fields from the fscrypt_context */
Zhen Kongee7bdc62019-03-14 10:55:19 -070097
Theodore Ts'occ4e0df2016-11-26 22:05:18 -050098 u8 ci_data_mode;
99 u8 ci_filename_mode;
100 u8 ci_flags;
Eric Biggers78d7a792018-11-26 11:27:37 -0800101 u8 ci_master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
102 u8 ci_nonce[FS_KEY_DERIVATION_NONCE_SIZE];
Zhen Kongee7bdc62019-03-14 10:55:19 -0700103 u8 ci_raw_key[FS_MAX_KEY_SIZE];
Theodore Ts'occ4e0df2016-11-26 22:05:18 -0500104};
105
Richard Weinberger58ae7462016-12-19 12:25:32 +0100106typedef enum {
107 FS_DECRYPT = 0,
108 FS_ENCRYPT,
109} fscrypt_direction_t;
110
Theodore Ts'occ4e0df2016-11-26 22:05:18 -0500111#define FS_CTX_REQUIRES_FREE_ENCRYPT_FL 0x00000001
David Gstir6a34e4d2016-12-06 23:53:58 +0100112#define FS_CTX_HAS_BOUNCE_BUFFER_FL 0x00000002
Theodore Ts'occ4e0df2016-11-26 22:05:18 -0500113
Eric Biggersbb8179e2018-01-05 10:44:58 -0800114static inline bool fscrypt_valid_enc_modes(u32 contents_mode,
115 u32 filenames_mode)
116{
117 if (contents_mode == FS_ENCRYPTION_MODE_AES_128_CBC &&
118 filenames_mode == FS_ENCRYPTION_MODE_AES_128_CTS)
119 return true;
120
121 if (contents_mode == FS_ENCRYPTION_MODE_AES_256_XTS &&
122 filenames_mode == FS_ENCRYPTION_MODE_AES_256_CTS)
123 return true;
124
Eric Biggers78d7a792018-11-26 11:27:37 -0800125 if (contents_mode == FS_ENCRYPTION_MODE_ADIANTUM &&
126 filenames_mode == FS_ENCRYPTION_MODE_ADIANTUM)
127 return true;
128
Zhen Kongee7bdc62019-03-14 10:55:19 -0700129 if (contents_mode == FS_ENCRYPTION_MODE_PRIVATE &&
130 filenames_mode == FS_ENCRYPTION_MODE_AES_256_CTS)
131 return true;
132
Eric Biggersbb8179e2018-01-05 10:44:58 -0800133 return false;
134}
135
Theodore Ts'ob98701df2016-11-26 20:43:09 -0500136/* crypto.c */
Eric Biggerse4de7822018-01-05 10:44:54 -0800137extern struct kmem_cache *fscrypt_info_cachep;
Richard Weinberger58ae7462016-12-19 12:25:32 +0100138extern int fscrypt_initialize(unsigned int cop_flags);
Richard Weinberger58ae7462016-12-19 12:25:32 +0100139extern int fscrypt_do_page_crypto(const struct inode *inode,
140 fscrypt_direction_t rw, u64 lblk_num,
141 struct page *src_page,
142 struct page *dest_page,
143 unsigned int len, unsigned int offs,
144 gfp_t gfp_flags);
145extern struct page *fscrypt_alloc_bounce_page(struct fscrypt_ctx *ctx,
146 gfp_t gfp_flags);
Eric Biggers54222022018-04-30 15:51:36 -0700147extern const struct dentry_operations fscrypt_d_ops;
Theodore Ts'ob98701df2016-11-26 20:43:09 -0500148
Eric Biggers544d08f2018-04-30 15:51:47 -0700149extern void __printf(3, 4) __cold
150fscrypt_msg(struct super_block *sb, const char *level, const char *fmt, ...);
151
152#define fscrypt_warn(sb, fmt, ...) \
153 fscrypt_msg(sb, KERN_WARNING, fmt, ##__VA_ARGS__)
154#define fscrypt_err(sb, fmt, ...) \
155 fscrypt_msg(sb, KERN_ERR, fmt, ##__VA_ARGS__)
156
Eric Biggers78d7a792018-11-26 11:27:37 -0800157#define FSCRYPT_MAX_IV_SIZE 32
158
159union fscrypt_iv {
160 struct {
161 /* logical block number within the file */
162 __le64 lblk_num;
163
164 /* per-file nonce; only set in DIRECT_KEY mode */
165 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
166 };
167 u8 raw[FSCRYPT_MAX_IV_SIZE];
168};
169
170void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num,
171 const struct fscrypt_info *ci);
172
Eric Biggers76e81d62018-01-05 10:45:01 -0800173/* fname.c */
Eric Biggers50c961d2018-01-11 23:30:08 -0500174extern int fname_encrypt(struct inode *inode, const struct qstr *iname,
175 u8 *out, unsigned int olen);
Eric Biggersb9db0b42018-01-11 23:30:08 -0500176extern bool fscrypt_fname_encrypted_size(const struct inode *inode,
177 u32 orig_len, u32 max_len,
178 u32 *encrypted_len_ret);
Eric Biggers76e81d62018-01-05 10:45:01 -0800179
Daniel Walterb7e7cf72017-06-19 09:27:58 +0200180/* keyinfo.c */
Eric Biggers78d7a792018-11-26 11:27:37 -0800181
182struct fscrypt_mode {
183 const char *friendly_name;
184 const char *cipher_str;
185 int keysize;
186 int ivsize;
187 bool logged_impl_name;
188 bool needs_essiv;
Zhen Kongee7bdc62019-03-14 10:55:19 -0700189 bool inline_encryption;
Eric Biggers78d7a792018-11-26 11:27:37 -0800190};
191
Daniel Walterb7e7cf72017-06-19 09:27:58 +0200192extern void __exit fscrypt_essiv_cleanup(void);
193
Theodore Ts'o3325bea2016-11-26 20:32:46 -0500194#endif /* _FSCRYPT_PRIVATE_H */