Commit 2336d0de authored by Eric Biggers's avatar Eric Biggers

fscrypt: use FSCRYPT_ prefix for uapi constants

Prefix all filesystem encryption UAPI constants except the ioctl numbers
with "FSCRYPT_" rather than with "FS_".  This namespaces the constants
more appropriately and makes it clear that they are related specifically
to the filesystem encryption feature, and to the 'fscrypt_*' structures.
With some of the old names like "FS_POLICY_FLAGS_VALID", it was not
immediately clear that the constant had anything to do with encryption.

This is also useful because we'll be adding more encryption-related
constants, e.g. for the policy version, and we'd otherwise have to
choose whether to use unclear names like FS_POLICY_V1 or inconsistent
names like FS_ENCRYPTION_POLICY_V1.

For source compatibility with existing userspace programs, keep the old
names defined as aliases to the new names.

Finally, as long as new names are being defined anyway, I skipped
defining new names for the fscrypt mode numbers that aren't actually
used: INVALID (0), AES_256_GCM (2), AES_256_CBC (3), SPECK128_256_XTS
(7), and SPECK128_256_CTS (8).
Reviewed-by: default avatarTheodore Ts'o <tytso@mit.edu>
Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
parent 7af0ab0d
...@@ -225,9 +225,10 @@ a little endian number, except that: ...@@ -225,9 +225,10 @@ a little endian number, except that:
is encrypted with AES-256 where the AES-256 key is the SHA-256 hash is encrypted with AES-256 where the AES-256 key is the SHA-256 hash
of the file's data encryption key. of the file's data encryption key.
- In the "direct key" configuration (FS_POLICY_FLAG_DIRECT_KEY set in - In the "direct key" configuration (FSCRYPT_POLICY_FLAG_DIRECT_KEY
the fscrypt_policy), the file's nonce is also appended to the IV. set in the fscrypt_policy), the file's nonce is also appended to the
Currently this is only allowed with the Adiantum encryption mode. IV. Currently this is only allowed with the Adiantum encryption
mode.
Filenames encryption Filenames encryption
-------------------- --------------------
...@@ -274,14 +275,14 @@ empty directory or verifies that a directory or regular file already ...@@ -274,14 +275,14 @@ empty directory or verifies that a directory or regular file already
has the specified encryption policy. It takes in a pointer to a has the specified encryption policy. It takes in a pointer to a
:c:type:`struct fscrypt_policy`, defined as follows:: :c:type:`struct fscrypt_policy`, defined as follows::
#define FS_KEY_DESCRIPTOR_SIZE 8 #define FSCRYPT_KEY_DESCRIPTOR_SIZE 8
struct fscrypt_policy { struct fscrypt_policy {
__u8 version; __u8 version;
__u8 contents_encryption_mode; __u8 contents_encryption_mode;
__u8 filenames_encryption_mode; __u8 filenames_encryption_mode;
__u8 flags; __u8 flags;
__u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE]; __u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
}; };
This structure must be initialized as follows: This structure must be initialized as follows:
...@@ -289,19 +290,18 @@ This structure must be initialized as follows: ...@@ -289,19 +290,18 @@ This structure must be initialized as follows:
- ``version`` must be 0. - ``version`` must be 0.
- ``contents_encryption_mode`` and ``filenames_encryption_mode`` must - ``contents_encryption_mode`` and ``filenames_encryption_mode`` must
be set to constants from ``<linux/fs.h>`` which identify the be set to constants from ``<linux/fscrypt.h>`` which identify the
encryption modes to use. If unsure, use encryption modes to use. If unsure, use FSCRYPT_MODE_AES_256_XTS
FS_ENCRYPTION_MODE_AES_256_XTS (1) for ``contents_encryption_mode`` (1) for ``contents_encryption_mode`` and FSCRYPT_MODE_AES_256_CTS
and FS_ENCRYPTION_MODE_AES_256_CTS (4) for (4) for ``filenames_encryption_mode``.
``filenames_encryption_mode``.
- ``flags`` must contain a value from ``<linux/fs.h>`` which - ``flags`` must contain a value from ``<linux/fscrypt.h>`` which
identifies the amount of NUL-padding to use when encrypting identifies the amount of NUL-padding to use when encrypting
filenames. If unsure, use FS_POLICY_FLAGS_PAD_32 (0x3). filenames. If unsure, use FSCRYPT_POLICY_FLAGS_PAD_32 (0x3). In
In addition, if the chosen encryption modes are both addition, if the chosen encryption modes are both
FS_ENCRYPTION_MODE_ADIANTUM, this can contain FSCRYPT_MODE_ADIANTUM, this can contain
FS_POLICY_FLAG_DIRECT_KEY to specify that the master key should be FSCRYPT_POLICY_FLAG_DIRECT_KEY to specify that the master key should
used directly, without key derivation. be used directly, without key derivation.
- ``master_key_descriptor`` specifies how to find the master key in - ``master_key_descriptor`` specifies how to find the master key in
the keyring; see `Adding keys`_. It is up to userspace to choose a the keyring; see `Adding keys`_. It is up to userspace to choose a
...@@ -401,11 +401,11 @@ followed by the 16-character lower case hex representation of the ...@@ -401,11 +401,11 @@ followed by the 16-character lower case hex representation of the
``master_key_descriptor`` that was set in the encryption policy. The ``master_key_descriptor`` that was set in the encryption policy. The
key payload must conform to the following structure:: key payload must conform to the following structure::
#define FS_MAX_KEY_SIZE 64 #define FSCRYPT_MAX_KEY_SIZE 64
struct fscrypt_key { struct fscrypt_key {
u32 mode; u32 mode;
u8 raw[FS_MAX_KEY_SIZE]; u8 raw[FSCRYPT_MAX_KEY_SIZE];
u32 size; u32 size;
}; };
...@@ -574,7 +574,7 @@ much confusion if an encryption policy were to be added to or removed ...@@ -574,7 +574,7 @@ much confusion if an encryption policy were to be added to or removed
from anything other than an empty directory.) The struct is defined from anything other than an empty directory.) The struct is defined
as follows:: as follows::
#define FS_KEY_DESCRIPTOR_SIZE 8 #define FSCRYPT_KEY_DESCRIPTOR_SIZE 8
#define FS_KEY_DERIVATION_NONCE_SIZE 16 #define FS_KEY_DERIVATION_NONCE_SIZE 16
struct fscrypt_context { struct fscrypt_context {
...@@ -582,7 +582,7 @@ as follows:: ...@@ -582,7 +582,7 @@ as follows::
u8 contents_encryption_mode; u8 contents_encryption_mode;
u8 filenames_encryption_mode; u8 filenames_encryption_mode;
u8 flags; u8 flags;
u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE]; u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE]; u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE];
}; };
......
...@@ -10,35 +10,30 @@ ...@@ -10,35 +10,30 @@
#include <linux/types.h> #include <linux/types.h>
#define FS_KEY_DESCRIPTOR_SIZE 8 #define FSCRYPT_KEY_DESCRIPTOR_SIZE 8
/* Encryption policy flags */ /* Encryption policy flags */
#define FS_POLICY_FLAGS_PAD_4 0x00 #define FSCRYPT_POLICY_FLAGS_PAD_4 0x00
#define FS_POLICY_FLAGS_PAD_8 0x01 #define FSCRYPT_POLICY_FLAGS_PAD_8 0x01
#define FS_POLICY_FLAGS_PAD_16 0x02 #define FSCRYPT_POLICY_FLAGS_PAD_16 0x02
#define FS_POLICY_FLAGS_PAD_32 0x03 #define FSCRYPT_POLICY_FLAGS_PAD_32 0x03
#define FS_POLICY_FLAGS_PAD_MASK 0x03 #define FSCRYPT_POLICY_FLAGS_PAD_MASK 0x03
#define FS_POLICY_FLAG_DIRECT_KEY 0x04 /* use master key directly */ #define FSCRYPT_POLICY_FLAG_DIRECT_KEY 0x04 /* use master key directly */
#define FS_POLICY_FLAGS_VALID 0x07 #define FSCRYPT_POLICY_FLAGS_VALID 0x07
/* Encryption algorithms */ /* Encryption algorithms */
#define FS_ENCRYPTION_MODE_INVALID 0 #define FSCRYPT_MODE_AES_256_XTS 1
#define FS_ENCRYPTION_MODE_AES_256_XTS 1 #define FSCRYPT_MODE_AES_256_CTS 4
#define FS_ENCRYPTION_MODE_AES_256_GCM 2 #define FSCRYPT_MODE_AES_128_CBC 5
#define FS_ENCRYPTION_MODE_AES_256_CBC 3 #define FSCRYPT_MODE_AES_128_CTS 6
#define FS_ENCRYPTION_MODE_AES_256_CTS 4 #define FSCRYPT_MODE_ADIANTUM 9
#define FS_ENCRYPTION_MODE_AES_128_CBC 5
#define FS_ENCRYPTION_MODE_AES_128_CTS 6
#define FS_ENCRYPTION_MODE_SPECK128_256_XTS 7 /* Removed, do not use. */
#define FS_ENCRYPTION_MODE_SPECK128_256_CTS 8 /* Removed, do not use. */
#define FS_ENCRYPTION_MODE_ADIANTUM 9
struct fscrypt_policy { struct fscrypt_policy {
__u8 version; __u8 version;
__u8 contents_encryption_mode; __u8 contents_encryption_mode;
__u8 filenames_encryption_mode; __u8 filenames_encryption_mode;
__u8 flags; __u8 flags;
__u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE]; __u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
}; };
#define FS_IOC_SET_ENCRYPTION_POLICY _IOR('f', 19, struct fscrypt_policy) #define FS_IOC_SET_ENCRYPTION_POLICY _IOR('f', 19, struct fscrypt_policy)
...@@ -46,16 +41,40 @@ struct fscrypt_policy { ...@@ -46,16 +41,40 @@ struct fscrypt_policy {
#define FS_IOC_GET_ENCRYPTION_POLICY _IOW('f', 21, struct fscrypt_policy) #define FS_IOC_GET_ENCRYPTION_POLICY _IOW('f', 21, struct fscrypt_policy)
/* Parameters for passing an encryption key into the kernel keyring */ /* Parameters for passing an encryption key into the kernel keyring */
#define FS_KEY_DESC_PREFIX "fscrypt:" #define FSCRYPT_KEY_DESC_PREFIX "fscrypt:"
#define FS_KEY_DESC_PREFIX_SIZE 8 #define FSCRYPT_KEY_DESC_PREFIX_SIZE 8
/* Structure that userspace passes to the kernel keyring */ /* Structure that userspace passes to the kernel keyring */
#define FS_MAX_KEY_SIZE 64 #define FSCRYPT_MAX_KEY_SIZE 64
struct fscrypt_key { struct fscrypt_key {
__u32 mode; __u32 mode;
__u8 raw[FS_MAX_KEY_SIZE]; __u8 raw[FSCRYPT_MAX_KEY_SIZE];
__u32 size; __u32 size;
}; };
/**********************************************************************/
/* old names; don't add anything new here! */
#define FS_KEY_DESCRIPTOR_SIZE FSCRYPT_KEY_DESCRIPTOR_SIZE
#define FS_POLICY_FLAGS_PAD_4 FSCRYPT_POLICY_FLAGS_PAD_4
#define FS_POLICY_FLAGS_PAD_8 FSCRYPT_POLICY_FLAGS_PAD_8
#define FS_POLICY_FLAGS_PAD_16 FSCRYPT_POLICY_FLAGS_PAD_16
#define FS_POLICY_FLAGS_PAD_32 FSCRYPT_POLICY_FLAGS_PAD_32
#define FS_POLICY_FLAGS_PAD_MASK FSCRYPT_POLICY_FLAGS_PAD_MASK
#define FS_POLICY_FLAG_DIRECT_KEY FSCRYPT_POLICY_FLAG_DIRECT_KEY
#define FS_POLICY_FLAGS_VALID FSCRYPT_POLICY_FLAGS_VALID
#define FS_ENCRYPTION_MODE_INVALID 0 /* never used */
#define FS_ENCRYPTION_MODE_AES_256_XTS FSCRYPT_MODE_AES_256_XTS
#define FS_ENCRYPTION_MODE_AES_256_GCM 2 /* never used */
#define FS_ENCRYPTION_MODE_AES_256_CBC 3 /* never used */
#define FS_ENCRYPTION_MODE_AES_256_CTS FSCRYPT_MODE_AES_256_CTS
#define FS_ENCRYPTION_MODE_AES_128_CBC FSCRYPT_MODE_AES_128_CBC
#define FS_ENCRYPTION_MODE_AES_128_CTS FSCRYPT_MODE_AES_128_CTS
#define FS_ENCRYPTION_MODE_SPECK128_256_XTS 7 /* removed */
#define FS_ENCRYPTION_MODE_SPECK128_256_CTS 8 /* removed */
#define FS_ENCRYPTION_MODE_ADIANTUM FSCRYPT_MODE_ADIANTUM
#define FS_KEY_DESC_PREFIX FSCRYPT_KEY_DESC_PREFIX
#define FS_KEY_DESC_PREFIX_SIZE FSCRYPT_KEY_DESC_PREFIX_SIZE
#define FS_MAX_KEY_SIZE FSCRYPT_MAX_KEY_SIZE
#endif /* _UAPI_LINUX_FSCRYPT_H */ #endif /* _UAPI_LINUX_FSCRYPT_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment