xref: /linux/Documentation/filesystems/fscrypt.rst (revision 975ef7ff81bb000af6e6c8e63e81f89f3468dcf7)
1=====================================
2Filesystem-level encryption (fscrypt)
3=====================================
4
5Introduction
6============
7
8fscrypt is a library which filesystems can hook into to support
9transparent encryption of files and directories.
10
11Note: "fscrypt" in this document refers to the kernel-level portion,
12implemented in ``fs/crypto/``, as opposed to the userspace tool
13`fscrypt <https://github.com/google/fscrypt>`_.  This document only
14covers the kernel-level portion.  For command-line examples of how to
15use encryption, see the documentation for the userspace tool `fscrypt
16<https://github.com/google/fscrypt>`_.  Also, it is recommended to use
17the fscrypt userspace tool, or other existing userspace tools such as
18`fscryptctl <https://github.com/google/fscryptctl>`_ or `Android's key
19management system
20<https://source.android.com/security/encryption/file-based>`_, over
21using the kernel's API directly.  Using existing tools reduces the
22chance of introducing your own security bugs.  (Nevertheless, for
23completeness this documentation covers the kernel's API anyway.)
24
25Unlike dm-crypt, fscrypt operates at the filesystem level rather than
26at the block device level.  This allows it to encrypt different files
27with different keys and to have unencrypted files on the same
28filesystem.  This is useful for multi-user systems where each user's
29data-at-rest needs to be cryptographically isolated from the others.
30However, except for filenames, fscrypt does not encrypt filesystem
31metadata.
32
33Unlike eCryptfs, which is a stacked filesystem, fscrypt is integrated
34directly into supported filesystems --- currently ext4, F2FS, and
35UBIFS.  This allows encrypted files to be read and written without
36caching both the decrypted and encrypted pages in the pagecache,
37thereby nearly halving the memory used and bringing it in line with
38unencrypted files.  Similarly, half as many dentries and inodes are
39needed.  eCryptfs also limits encrypted filenames to 143 bytes,
40causing application compatibility issues; fscrypt allows the full 255
41bytes (NAME_MAX).  Finally, unlike eCryptfs, the fscrypt API can be
42used by unprivileged users, with no need to mount anything.
43
44fscrypt does not support encrypting files in-place.  Instead, it
45supports marking an empty directory as encrypted.  Then, after
46userspace provides the key, all regular files, directories, and
47symbolic links created in that directory tree are transparently
48encrypted.
49
50Threat model
51============
52
53Offline attacks
54---------------
55
56Provided that userspace chooses a strong encryption key, fscrypt
57protects the confidentiality of file contents and filenames in the
58event of a single point-in-time permanent offline compromise of the
59block device content.  fscrypt does not protect the confidentiality of
60non-filename metadata, e.g. file sizes, file permissions, file
61timestamps, and extended attributes.  Also, the existence and location
62of holes (unallocated blocks which logically contain all zeroes) in
63files is not protected.
64
65fscrypt is not guaranteed to protect confidentiality or authenticity
66if an attacker is able to manipulate the filesystem offline prior to
67an authorized user later accessing the filesystem.
68
69Online attacks
70--------------
71
72fscrypt (and storage encryption in general) can only provide limited
73protection, if any at all, against online attacks.  In detail:
74
75fscrypt is only resistant to side-channel attacks, such as timing or
76electromagnetic attacks, to the extent that the underlying Linux
77Cryptographic API algorithms are.  If a vulnerable algorithm is used,
78such as a table-based implementation of AES, it may be possible for an
79attacker to mount a side channel attack against the online system.
80Side channel attacks may also be mounted against applications
81consuming decrypted data.
82
83After an encryption key has been provided, fscrypt is not designed to
84hide the plaintext file contents or filenames from other users on the
85same system, regardless of the visibility of the keyring key.
86Instead, existing access control mechanisms such as file mode bits,
87POSIX ACLs, LSMs, or mount namespaces should be used for this purpose.
88Also note that as long as the encryption keys are *anywhere* in
89memory, an online attacker can necessarily compromise them by mounting
90a physical attack or by exploiting any kernel security vulnerability
91which provides an arbitrary memory read primitive.
92
93While it is ostensibly possible to "evict" keys from the system,
94recently accessed encrypted files will remain accessible at least
95until the filesystem is unmounted or the VFS caches are dropped, e.g.
96using ``echo 2 > /proc/sys/vm/drop_caches``.  Even after that, if the
97RAM is compromised before being powered off, it will likely still be
98possible to recover portions of the plaintext file contents, if not
99some of the encryption keys as well.  (Since Linux v4.12, all
100in-kernel keys related to fscrypt are sanitized before being freed.
101However, userspace would need to do its part as well.)
102
103Currently, fscrypt does not prevent a user from maliciously providing
104an incorrect key for another user's existing encrypted files.  A
105protection against this is planned.
106
107Key hierarchy
108=============
109
110Master Keys
111-----------
112
113Each encrypted directory tree is protected by a *master key*.  Master
114keys can be up to 64 bytes long, and must be at least as long as the
115greater of the key length needed by the contents and filenames
116encryption modes being used.  For example, if AES-256-XTS is used for
117contents encryption, the master key must be 64 bytes (512 bits).  Note
118that the XTS mode is defined to require a key twice as long as that
119required by the underlying block cipher.
120
121To "unlock" an encrypted directory tree, userspace must provide the
122appropriate master key.  There can be any number of master keys, each
123of which protects any number of directory trees on any number of
124filesystems.
125
126Userspace should generate master keys either using a cryptographically
127secure random number generator, or by using a KDF (Key Derivation
128Function).  Note that whenever a KDF is used to "stretch" a
129lower-entropy secret such as a passphrase, it is critical that a KDF
130designed for this purpose be used, such as scrypt, PBKDF2, or Argon2.
131
132Per-file keys
133-------------
134
135Master keys are not used to encrypt file contents or names directly.
136Instead, a unique key is derived for each encrypted file, including
137each regular file, directory, and symbolic link.  This has several
138advantages:
139
140- In cryptosystems, the same key material should never be used for
141  different purposes.  Using the master key as both an XTS key for
142  contents encryption and as a CTS-CBC key for filenames encryption
143  would violate this rule.
144- Per-file keys simplify the choice of IVs (Initialization Vectors)
145  for contents encryption.  Without per-file keys, to ensure IV
146  uniqueness both the inode and logical block number would need to be
147  encoded in the IVs.  This would make it impossible to renumber
148  inodes, which e.g. ``resize2fs`` can do when resizing an ext4
149  filesystem.  With per-file keys, it is sufficient to encode just the
150  logical block number in the IVs.
151- Per-file keys strengthen the encryption of filenames, where IVs are
152  reused out of necessity.  With a unique key per directory, IV reuse
153  is limited to within a single directory.
154- Per-file keys allow individual files to be securely erased simply by
155  securely erasing their keys.  (Not yet implemented.)
156
157A KDF (Key Derivation Function) is used to derive per-file keys from
158the master key.  This is done instead of wrapping a randomly-generated
159key for each file because it reduces the size of the encryption xattr,
160which for some filesystems makes the xattr more likely to fit in-line
161in the filesystem's inode table.  With a KDF, only a 16-byte nonce is
162required --- long enough to make key reuse extremely unlikely.  A
163wrapped key, on the other hand, would need to be up to 64 bytes ---
164the length of an AES-256-XTS key.  Furthermore, currently there is no
165requirement to support unlocking a file with multiple alternative
166master keys or to support rotating master keys.  Instead, the master
167keys may be wrapped in userspace, e.g. as done by the `fscrypt
168<https://github.com/google/fscrypt>`_ tool.
169
170The current KDF encrypts the master key using the 16-byte nonce as an
171AES-128-ECB key.  The output is used as the derived key.  If the
172output is longer than needed, then it is truncated to the needed
173length.  Truncation is the norm for directories and symlinks, since
174those use the CTS-CBC encryption mode which requires a key half as
175long as that required by the XTS encryption mode.
176
177Note: this KDF meets the primary security requirement, which is to
178produce unique derived keys that preserve the entropy of the master
179key, assuming that the master key is already a good pseudorandom key.
180However, it is nonstandard and has some problems such as being
181reversible, so it is generally considered to be a mistake!  It may be
182replaced with HKDF or another more standard KDF in the future.
183
184Encryption modes and usage
185==========================
186
187fscrypt allows one encryption mode to be specified for file contents
188and one encryption mode to be specified for filenames.  Different
189directory trees are permitted to use different encryption modes.
190Currently, the following pairs of encryption modes are supported:
191
192- AES-256-XTS for contents and AES-256-CTS-CBC for filenames
193- AES-128-CBC for contents and AES-128-CTS-CBC for filenames
194- Speck128/256-XTS for contents and Speck128/256-CTS-CBC for filenames
195
196It is strongly recommended to use AES-256-XTS for contents encryption.
197AES-128-CBC was added only for low-powered embedded devices with
198crypto accelerators such as CAAM or CESA that do not support XTS.
199
200Similarly, Speck128/256 support was only added for older or low-end
201CPUs which cannot do AES fast enough -- especially ARM CPUs which have
202NEON instructions but not the Cryptography Extensions -- and for which
203it would not otherwise be feasible to use encryption at all.  It is
204not recommended to use Speck on CPUs that have AES instructions.
205Speck support is only available if it has been enabled in the crypto
206API via CONFIG_CRYPTO_SPECK.  Also, on ARM platforms, to get
207acceptable performance CONFIG_CRYPTO_SPECK_NEON must be enabled.
208
209New encryption modes can be added relatively easily, without changes
210to individual filesystems.  However, authenticated encryption (AE)
211modes are not currently supported because of the difficulty of dealing
212with ciphertext expansion.
213
214For file contents, each filesystem block is encrypted independently.
215Currently, only the case where the filesystem block size is equal to
216the system's page size (usually 4096 bytes) is supported.  With the
217XTS mode of operation (recommended), the logical block number within
218the file is used as the IV.  With the CBC mode of operation (not
219recommended), ESSIV is used; specifically, the IV for CBC is the
220logical block number encrypted with AES-256, where the AES-256 key is
221the SHA-256 hash of the inode's data encryption key.
222
223For filenames, the full filename is encrypted at once.  Because of the
224requirements to retain support for efficient directory lookups and
225filenames of up to 255 bytes, a constant initialization vector (IV) is
226used.  However, each encrypted directory uses a unique key, which
227limits IV reuse to within a single directory.  Note that IV reuse in
228the context of CTS-CBC encryption means that when the original
229filenames share a common prefix at least as long as the cipher block
230size (16 bytes for AES), the corresponding encrypted filenames will
231also share a common prefix.  This is undesirable; it may be fixed in
232the future by switching to an encryption mode that is a strong
233pseudorandom permutation on arbitrary-length messages, e.g. the HEH
234(Hash-Encrypt-Hash) mode.
235
236Since filenames are encrypted with the CTS-CBC mode of operation, the
237plaintext and ciphertext filenames need not be multiples of the AES
238block size, i.e. 16 bytes.  However, the minimum size that can be
239encrypted is 16 bytes, so shorter filenames are NUL-padded to 16 bytes
240before being encrypted.  In addition, to reduce leakage of filename
241lengths via their ciphertexts, all filenames are NUL-padded to the
242next 4, 8, 16, or 32-byte boundary (configurable).  32 is recommended
243since this provides the best confidentiality, at the cost of making
244directory entries consume slightly more space.  Note that since NUL
245(``\0``) is not otherwise a valid character in filenames, the padding
246will never produce duplicate plaintexts.
247
248Symbolic link targets are considered a type of filename and are
249encrypted in the same way as filenames in directory entries.  Each
250symlink also uses a unique key; hence, the hardcoded IV is not a
251problem for symlinks.
252
253User API
254========
255
256Setting an encryption policy
257----------------------------
258
259The FS_IOC_SET_ENCRYPTION_POLICY ioctl sets an encryption policy on an
260empty directory or verifies that a directory or regular file already
261has the specified encryption policy.  It takes in a pointer to a
262:c:type:`struct fscrypt_policy`, defined as follows::
263
264    #define FS_KEY_DESCRIPTOR_SIZE  8
265
266    struct fscrypt_policy {
267            __u8 version;
268            __u8 contents_encryption_mode;
269            __u8 filenames_encryption_mode;
270            __u8 flags;
271            __u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
272    };
273
274This structure must be initialized as follows:
275
276- ``version`` must be 0.
277
278- ``contents_encryption_mode`` and ``filenames_encryption_mode`` must
279  be set to constants from ``<linux/fs.h>`` which identify the
280  encryption modes to use.  If unsure, use
281  FS_ENCRYPTION_MODE_AES_256_XTS (1) for ``contents_encryption_mode``
282  and FS_ENCRYPTION_MODE_AES_256_CTS (4) for
283  ``filenames_encryption_mode``.
284
285- ``flags`` must be set to a value from ``<linux/fs.h>`` which
286  identifies the amount of NUL-padding to use when encrypting
287  filenames.  If unsure, use FS_POLICY_FLAGS_PAD_32 (0x3).
288
289- ``master_key_descriptor`` specifies how to find the master key in
290  the keyring; see `Adding keys`_.  It is up to userspace to choose a
291  unique ``master_key_descriptor`` for each master key.  The e4crypt
292  and fscrypt tools use the first 8 bytes of
293  ``SHA-512(SHA-512(master_key))``, but this particular scheme is not
294  required.  Also, the master key need not be in the keyring yet when
295  FS_IOC_SET_ENCRYPTION_POLICY is executed.  However, it must be added
296  before any files can be created in the encrypted directory.
297
298If the file is not yet encrypted, then FS_IOC_SET_ENCRYPTION_POLICY
299verifies that the file is an empty directory.  If so, the specified
300encryption policy is assigned to the directory, turning it into an
301encrypted directory.  After that, and after providing the
302corresponding master key as described in `Adding keys`_, all regular
303files, directories (recursively), and symlinks created in the
304directory will be encrypted, inheriting the same encryption policy.
305The filenames in the directory's entries will be encrypted as well.
306
307Alternatively, if the file is already encrypted, then
308FS_IOC_SET_ENCRYPTION_POLICY validates that the specified encryption
309policy exactly matches the actual one.  If they match, then the ioctl
310returns 0.  Otherwise, it fails with EEXIST.  This works on both
311regular files and directories, including nonempty directories.
312
313Note that the ext4 filesystem does not allow the root directory to be
314encrypted, even if it is empty.  Users who want to encrypt an entire
315filesystem with one key should consider using dm-crypt instead.
316
317FS_IOC_SET_ENCRYPTION_POLICY can fail with the following errors:
318
319- ``EACCES``: the file is not owned by the process's uid, nor does the
320  process have the CAP_FOWNER capability in a namespace with the file
321  owner's uid mapped
322- ``EEXIST``: the file is already encrypted with an encryption policy
323  different from the one specified
324- ``EINVAL``: an invalid encryption policy was specified (invalid
325  version, mode(s), or flags)
326- ``ENOTDIR``: the file is unencrypted and is a regular file, not a
327  directory
328- ``ENOTEMPTY``: the file is unencrypted and is a nonempty directory
329- ``ENOTTY``: this type of filesystem does not implement encryption
330- ``EOPNOTSUPP``: the kernel was not configured with encryption
331  support for this filesystem, or the filesystem superblock has not
332  had encryption enabled on it.  (For example, to use encryption on an
333  ext4 filesystem, CONFIG_EXT4_ENCRYPTION must be enabled in the
334  kernel config, and the superblock must have had the "encrypt"
335  feature flag enabled using ``tune2fs -O encrypt`` or ``mkfs.ext4 -O
336  encrypt``.)
337- ``EPERM``: this directory may not be encrypted, e.g. because it is
338  the root directory of an ext4 filesystem
339- ``EROFS``: the filesystem is readonly
340
341Getting an encryption policy
342----------------------------
343
344The FS_IOC_GET_ENCRYPTION_POLICY ioctl retrieves the :c:type:`struct
345fscrypt_policy`, if any, for a directory or regular file.  See above
346for the struct definition.  No additional permissions are required
347beyond the ability to open the file.
348
349FS_IOC_GET_ENCRYPTION_POLICY can fail with the following errors:
350
351- ``EINVAL``: the file is encrypted, but it uses an unrecognized
352  encryption context format
353- ``ENODATA``: the file is not encrypted
354- ``ENOTTY``: this type of filesystem does not implement encryption
355- ``EOPNOTSUPP``: the kernel was not configured with encryption
356  support for this filesystem
357
358Note: if you only need to know whether a file is encrypted or not, on
359most filesystems it is also possible to use the FS_IOC_GETFLAGS ioctl
360and check for FS_ENCRYPT_FL, or to use the statx() system call and
361check for STATX_ATTR_ENCRYPTED in stx_attributes.
362
363Getting the per-filesystem salt
364-------------------------------
365
366Some filesystems, such as ext4 and F2FS, also support the deprecated
367ioctl FS_IOC_GET_ENCRYPTION_PWSALT.  This ioctl retrieves a randomly
368generated 16-byte value stored in the filesystem superblock.  This
369value is intended to used as a salt when deriving an encryption key
370from a passphrase or other low-entropy user credential.
371
372FS_IOC_GET_ENCRYPTION_PWSALT is deprecated.  Instead, prefer to
373generate and manage any needed salt(s) in userspace.
374
375Adding keys
376-----------
377
378To provide a master key, userspace must add it to an appropriate
379keyring using the add_key() system call (see:
380``Documentation/security/keys/core.rst``).  The key type must be
381"logon"; keys of this type are kept in kernel memory and cannot be
382read back by userspace.  The key description must be "fscrypt:"
383followed by the 16-character lower case hex representation of the
384``master_key_descriptor`` that was set in the encryption policy.  The
385key payload must conform to the following structure::
386
387    #define FS_MAX_KEY_SIZE 64
388
389    struct fscrypt_key {
390            u32 mode;
391            u8 raw[FS_MAX_KEY_SIZE];
392            u32 size;
393    };
394
395``mode`` is ignored; just set it to 0.  The actual key is provided in
396``raw`` with ``size`` indicating its size in bytes.  That is, the
397bytes ``raw[0..size-1]`` (inclusive) are the actual key.
398
399The key description prefix "fscrypt:" may alternatively be replaced
400with a filesystem-specific prefix such as "ext4:".  However, the
401filesystem-specific prefixes are deprecated and should not be used in
402new programs.
403
404There are several different types of keyrings in which encryption keys
405may be placed, such as a session keyring, a user session keyring, or a
406user keyring.  Each key must be placed in a keyring that is "attached"
407to all processes that might need to access files encrypted with it, in
408the sense that request_key() will find the key.  Generally, if only
409processes belonging to a specific user need to access a given
410encrypted directory and no session keyring has been installed, then
411that directory's key should be placed in that user's user session
412keyring or user keyring.  Otherwise, a session keyring should be
413installed if needed, and the key should be linked into that session
414keyring, or in a keyring linked into that session keyring.
415
416Note: introducing the complex visibility semantics of keyrings here
417was arguably a mistake --- especially given that by design, after any
418process successfully opens an encrypted file (thereby setting up the
419per-file key), possessing the keyring key is not actually required for
420any process to read/write the file until its in-memory inode is
421evicted.  In the future there probably should be a way to provide keys
422directly to the filesystem instead, which would make the intended
423semantics clearer.
424
425Access semantics
426================
427
428With the key
429------------
430
431With the encryption key, encrypted regular files, directories, and
432symlinks behave very similarly to their unencrypted counterparts ---
433after all, the encryption is intended to be transparent.  However,
434astute users may notice some differences in behavior:
435
436- Unencrypted files, or files encrypted with a different encryption
437  policy (i.e. different key, modes, or flags), cannot be renamed or
438  linked into an encrypted directory; see `Encryption policy
439  enforcement`_.  Attempts to do so will fail with EPERM.  However,
440  encrypted files can be renamed within an encrypted directory, or
441  into an unencrypted directory.
442
443- Direct I/O is not supported on encrypted files.  Attempts to use
444  direct I/O on such files will fall back to buffered I/O.
445
446- The fallocate operations FALLOC_FL_COLLAPSE_RANGE,
447  FALLOC_FL_INSERT_RANGE, and FALLOC_FL_ZERO_RANGE are not supported
448  on encrypted files and will fail with EOPNOTSUPP.
449
450- Online defragmentation of encrypted files is not supported.  The
451  EXT4_IOC_MOVE_EXT and F2FS_IOC_MOVE_RANGE ioctls will fail with
452  EOPNOTSUPP.
453
454- The ext4 filesystem does not support data journaling with encrypted
455  regular files.  It will fall back to ordered data mode instead.
456
457- DAX (Direct Access) is not supported on encrypted files.
458
459- The st_size of an encrypted symlink will not necessarily give the
460  length of the symlink target as required by POSIX.  It will actually
461  give the length of the ciphertext, which will be slightly longer
462  than the plaintext due to NUL-padding and an extra 2-byte overhead.
463
464- The maximum length of an encrypted symlink is 2 bytes shorter than
465  the maximum length of an unencrypted symlink.  For example, on an
466  EXT4 filesystem with a 4K block size, unencrypted symlinks can be up
467  to 4095 bytes long, while encrypted symlinks can only be up to 4093
468  bytes long (both lengths excluding the terminating null).
469
470Note that mmap *is* supported.  This is possible because the pagecache
471for an encrypted file contains the plaintext, not the ciphertext.
472
473Without the key
474---------------
475
476Some filesystem operations may be performed on encrypted regular
477files, directories, and symlinks even before their encryption key has
478been provided:
479
480- File metadata may be read, e.g. using stat().
481
482- Directories may be listed, in which case the filenames will be
483  listed in an encoded form derived from their ciphertext.  The
484  current encoding algorithm is described in `Filename hashing and
485  encoding`_.  The algorithm is subject to change, but it is
486  guaranteed that the presented filenames will be no longer than
487  NAME_MAX bytes, will not contain the ``/`` or ``\0`` characters, and
488  will uniquely identify directory entries.
489
490  The ``.`` and ``..`` directory entries are special.  They are always
491  present and are not encrypted or encoded.
492
493- Files may be deleted.  That is, nondirectory files may be deleted
494  with unlink() as usual, and empty directories may be deleted with
495  rmdir() as usual.  Therefore, ``rm`` and ``rm -r`` will work as
496  expected.
497
498- Symlink targets may be read and followed, but they will be presented
499  in encrypted form, similar to filenames in directories.  Hence, they
500  are unlikely to point to anywhere useful.
501
502Without the key, regular files cannot be opened or truncated.
503Attempts to do so will fail with ENOKEY.  This implies that any
504regular file operations that require a file descriptor, such as
505read(), write(), mmap(), fallocate(), and ioctl(), are also forbidden.
506
507Also without the key, files of any type (including directories) cannot
508be created or linked into an encrypted directory, nor can a name in an
509encrypted directory be the source or target of a rename, nor can an
510O_TMPFILE temporary file be created in an encrypted directory.  All
511such operations will fail with ENOKEY.
512
513It is not currently possible to backup and restore encrypted files
514without the encryption key.  This would require special APIs which
515have not yet been implemented.
516
517Encryption policy enforcement
518=============================
519
520After an encryption policy has been set on a directory, all regular
521files, directories, and symbolic links created in that directory
522(recursively) will inherit that encryption policy.  Special files ---
523that is, named pipes, device nodes, and UNIX domain sockets --- will
524not be encrypted.
525
526Except for those special files, it is forbidden to have unencrypted
527files, or files encrypted with a different encryption policy, in an
528encrypted directory tree.  Attempts to link or rename such a file into
529an encrypted directory will fail with EPERM.  This is also enforced
530during ->lookup() to provide limited protection against offline
531attacks that try to disable or downgrade encryption in known locations
532where applications may later write sensitive data.  It is recommended
533that systems implementing a form of "verified boot" take advantage of
534this by validating all top-level encryption policies prior to access.
535
536Implementation details
537======================
538
539Encryption context
540------------------
541
542An encryption policy is represented on-disk by a :c:type:`struct
543fscrypt_context`.  It is up to individual filesystems to decide where
544to store it, but normally it would be stored in a hidden extended
545attribute.  It should *not* be exposed by the xattr-related system
546calls such as getxattr() and setxattr() because of the special
547semantics of the encryption xattr.  (In particular, there would be
548much confusion if an encryption policy were to be added to or removed
549from anything other than an empty directory.)  The struct is defined
550as follows::
551
552    #define FS_KEY_DESCRIPTOR_SIZE  8
553    #define FS_KEY_DERIVATION_NONCE_SIZE 16
554
555    struct fscrypt_context {
556            u8 format;
557            u8 contents_encryption_mode;
558            u8 filenames_encryption_mode;
559            u8 flags;
560            u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE];
561            u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
562    };
563
564Note that :c:type:`struct fscrypt_context` contains the same
565information as :c:type:`struct fscrypt_policy` (see `Setting an
566encryption policy`_), except that :c:type:`struct fscrypt_context`
567also contains a nonce.  The nonce is randomly generated by the kernel
568and is used to derive the inode's encryption key as described in
569`Per-file keys`_.
570
571Data path changes
572-----------------
573
574For the read path (->readpage()) of regular files, filesystems can
575read the ciphertext into the page cache and decrypt it in-place.  The
576page lock must be held until decryption has finished, to prevent the
577page from becoming visible to userspace prematurely.
578
579For the write path (->writepage()) of regular files, filesystems
580cannot encrypt data in-place in the page cache, since the cached
581plaintext must be preserved.  Instead, filesystems must encrypt into a
582temporary buffer or "bounce page", then write out the temporary
583buffer.  Some filesystems, such as UBIFS, already use temporary
584buffers regardless of encryption.  Other filesystems, such as ext4 and
585F2FS, have to allocate bounce pages specially for encryption.
586
587Filename hashing and encoding
588-----------------------------
589
590Modern filesystems accelerate directory lookups by using indexed
591directories.  An indexed directory is organized as a tree keyed by
592filename hashes.  When a ->lookup() is requested, the filesystem
593normally hashes the filename being looked up so that it can quickly
594find the corresponding directory entry, if any.
595
596With encryption, lookups must be supported and efficient both with and
597without the encryption key.  Clearly, it would not work to hash the
598plaintext filenames, since the plaintext filenames are unavailable
599without the key.  (Hashing the plaintext filenames would also make it
600impossible for the filesystem's fsck tool to optimize encrypted
601directories.)  Instead, filesystems hash the ciphertext filenames,
602i.e. the bytes actually stored on-disk in the directory entries.  When
603asked to do a ->lookup() with the key, the filesystem just encrypts
604the user-supplied name to get the ciphertext.
605
606Lookups without the key are more complicated.  The raw ciphertext may
607contain the ``\0`` and ``/`` characters, which are illegal in
608filenames.  Therefore, readdir() must base64-encode the ciphertext for
609presentation.  For most filenames, this works fine; on ->lookup(), the
610filesystem just base64-decodes the user-supplied name to get back to
611the raw ciphertext.
612
613However, for very long filenames, base64 encoding would cause the
614filename length to exceed NAME_MAX.  To prevent this, readdir()
615actually presents long filenames in an abbreviated form which encodes
616a strong "hash" of the ciphertext filename, along with the optional
617filesystem-specific hash(es) needed for directory lookups.  This
618allows the filesystem to still, with a high degree of confidence, map
619the filename given in ->lookup() back to a particular directory entry
620that was previously listed by readdir().  See :c:type:`struct
621fscrypt_digested_name` in the source for more details.
622
623Note that the precise way that filenames are presented to userspace
624without the key is subject to change in the future.  It is only meant
625as a way to temporarily present valid filenames so that commands like
626``rm -r`` work as expected on encrypted directories.
627