xref: /linux-6.15/tools/include/uapi/linux/fscrypt.h (revision 11184466)
10ae40612SArnaldo Carvalho de Melo /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
20ae40612SArnaldo Carvalho de Melo /*
30ae40612SArnaldo Carvalho de Melo  * fscrypt user API
40ae40612SArnaldo Carvalho de Melo  *
50ae40612SArnaldo Carvalho de Melo  * These ioctls can be used on filesystems that support fscrypt.  See the
60ae40612SArnaldo Carvalho de Melo  * "User API" section of Documentation/filesystems/fscrypt.rst.
70ae40612SArnaldo Carvalho de Melo  */
80ae40612SArnaldo Carvalho de Melo #ifndef _UAPI_LINUX_FSCRYPT_H
90ae40612SArnaldo Carvalho de Melo #define _UAPI_LINUX_FSCRYPT_H
100ae40612SArnaldo Carvalho de Melo 
11f65b9dbaSArnaldo Carvalho de Melo #include <linux/ioctl.h>
120ae40612SArnaldo Carvalho de Melo #include <linux/types.h>
130ae40612SArnaldo Carvalho de Melo 
140ae40612SArnaldo Carvalho de Melo /* Encryption policy flags */
150ae40612SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_FLAGS_PAD_4		0x00
160ae40612SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_FLAGS_PAD_8		0x01
170ae40612SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_FLAGS_PAD_16		0x02
180ae40612SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_FLAGS_PAD_32		0x03
190ae40612SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_FLAGS_PAD_MASK		0x03
200ae40612SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_FLAG_DIRECT_KEY		0x04
21ad46f35cSArnaldo Carvalho de Melo #define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64	0x08
22d8e1ef67SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32	0x10
230ae40612SArnaldo Carvalho de Melo 
240ae40612SArnaldo Carvalho de Melo /* Encryption algorithms */
250ae40612SArnaldo Carvalho de Melo #define FSCRYPT_MODE_AES_256_XTS		1
260ae40612SArnaldo Carvalho de Melo #define FSCRYPT_MODE_AES_256_CTS		4
270ae40612SArnaldo Carvalho de Melo #define FSCRYPT_MODE_AES_128_CBC		5
280ae40612SArnaldo Carvalho de Melo #define FSCRYPT_MODE_AES_128_CTS		6
2943a3ce77SArnaldo Carvalho de Melo #define FSCRYPT_MODE_SM4_XTS			7
3043a3ce77SArnaldo Carvalho de Melo #define FSCRYPT_MODE_SM4_CTS			8
310ae40612SArnaldo Carvalho de Melo #define FSCRYPT_MODE_ADIANTUM			9
32fabe0c61SArnaldo Carvalho de Melo #define FSCRYPT_MODE_AES_256_HCTR2		10
33fabe0c61SArnaldo Carvalho de Melo /* If adding a mode number > 10, update FSCRYPT_MODE_MAX in fscrypt_private.h */
340ae40612SArnaldo Carvalho de Melo 
350ae40612SArnaldo Carvalho de Melo /*
360ae40612SArnaldo Carvalho de Melo  * Legacy policy version; ad-hoc KDF and no key verification.
370ae40612SArnaldo Carvalho de Melo  * For new encrypted directories, use fscrypt_policy_v2 instead.
380ae40612SArnaldo Carvalho de Melo  *
390ae40612SArnaldo Carvalho de Melo  * Careful: the .version field for this is actually 0, not 1.
400ae40612SArnaldo Carvalho de Melo  */
410ae40612SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_V1		0
420ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_DESCRIPTOR_SIZE	8
430ae40612SArnaldo Carvalho de Melo struct fscrypt_policy_v1 {
440ae40612SArnaldo Carvalho de Melo 	__u8 version;
450ae40612SArnaldo Carvalho de Melo 	__u8 contents_encryption_mode;
460ae40612SArnaldo Carvalho de Melo 	__u8 filenames_encryption_mode;
470ae40612SArnaldo Carvalho de Melo 	__u8 flags;
480ae40612SArnaldo Carvalho de Melo 	__u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
490ae40612SArnaldo Carvalho de Melo };
500ae40612SArnaldo Carvalho de Melo 
510ae40612SArnaldo Carvalho de Melo /*
520ae40612SArnaldo Carvalho de Melo  * Process-subscribed "logon" key description prefix and payload format.
530ae40612SArnaldo Carvalho de Melo  * Deprecated; prefer FS_IOC_ADD_ENCRYPTION_KEY instead.
540ae40612SArnaldo Carvalho de Melo  */
550ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_DESC_PREFIX		"fscrypt:"
560ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_DESC_PREFIX_SIZE	8
570ae40612SArnaldo Carvalho de Melo #define FSCRYPT_MAX_KEY_SIZE		64
580ae40612SArnaldo Carvalho de Melo struct fscrypt_key {
590ae40612SArnaldo Carvalho de Melo 	__u32 mode;
600ae40612SArnaldo Carvalho de Melo 	__u8 raw[FSCRYPT_MAX_KEY_SIZE];
610ae40612SArnaldo Carvalho de Melo 	__u32 size;
620ae40612SArnaldo Carvalho de Melo };
630ae40612SArnaldo Carvalho de Melo 
640ae40612SArnaldo Carvalho de Melo /*
650ae40612SArnaldo Carvalho de Melo  * New policy version with HKDF and key verification (recommended).
660ae40612SArnaldo Carvalho de Melo  */
670ae40612SArnaldo Carvalho de Melo #define FSCRYPT_POLICY_V2		2
680ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_IDENTIFIER_SIZE	16
690ae40612SArnaldo Carvalho de Melo struct fscrypt_policy_v2 {
700ae40612SArnaldo Carvalho de Melo 	__u8 version;
710ae40612SArnaldo Carvalho de Melo 	__u8 contents_encryption_mode;
720ae40612SArnaldo Carvalho de Melo 	__u8 filenames_encryption_mode;
730ae40612SArnaldo Carvalho de Melo 	__u8 flags;
74*11184466SNamhyung Kim 	__u8 log2_data_unit_size;
75*11184466SNamhyung Kim 	__u8 __reserved[3];
760ae40612SArnaldo Carvalho de Melo 	__u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
770ae40612SArnaldo Carvalho de Melo };
780ae40612SArnaldo Carvalho de Melo 
790ae40612SArnaldo Carvalho de Melo /* Struct passed to FS_IOC_GET_ENCRYPTION_POLICY_EX */
800ae40612SArnaldo Carvalho de Melo struct fscrypt_get_policy_ex_arg {
810ae40612SArnaldo Carvalho de Melo 	__u64 policy_size; /* input/output */
820ae40612SArnaldo Carvalho de Melo 	union {
830ae40612SArnaldo Carvalho de Melo 		__u8 version;
840ae40612SArnaldo Carvalho de Melo 		struct fscrypt_policy_v1 v1;
850ae40612SArnaldo Carvalho de Melo 		struct fscrypt_policy_v2 v2;
860ae40612SArnaldo Carvalho de Melo 	} policy; /* output */
870ae40612SArnaldo Carvalho de Melo };
880ae40612SArnaldo Carvalho de Melo 
890ae40612SArnaldo Carvalho de Melo /*
900ae40612SArnaldo Carvalho de Melo  * v1 policy keys are specified by an arbitrary 8-byte key "descriptor",
910ae40612SArnaldo Carvalho de Melo  * matching fscrypt_policy_v1::master_key_descriptor.
920ae40612SArnaldo Carvalho de Melo  */
930ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR	1
940ae40612SArnaldo Carvalho de Melo 
950ae40612SArnaldo Carvalho de Melo /*
960ae40612SArnaldo Carvalho de Melo  * v2 policy keys are specified by a 16-byte key "identifier" which the kernel
970ae40612SArnaldo Carvalho de Melo  * calculates as a cryptographic hash of the key itself,
980ae40612SArnaldo Carvalho de Melo  * matching fscrypt_policy_v2::master_key_identifier.
990ae40612SArnaldo Carvalho de Melo  */
1000ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER	2
1010ae40612SArnaldo Carvalho de Melo 
1020ae40612SArnaldo Carvalho de Melo /*
1030ae40612SArnaldo Carvalho de Melo  * Specifies a key, either for v1 or v2 policies.  This doesn't contain the
1040ae40612SArnaldo Carvalho de Melo  * actual key itself; this is just the "name" of the key.
1050ae40612SArnaldo Carvalho de Melo  */
1060ae40612SArnaldo Carvalho de Melo struct fscrypt_key_specifier {
1070ae40612SArnaldo Carvalho de Melo 	__u32 type;	/* one of FSCRYPT_KEY_SPEC_TYPE_* */
1080ae40612SArnaldo Carvalho de Melo 	__u32 __reserved;
1090ae40612SArnaldo Carvalho de Melo 	union {
1100ae40612SArnaldo Carvalho de Melo 		__u8 __reserved[32]; /* reserve some extra space */
1110ae40612SArnaldo Carvalho de Melo 		__u8 descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
1120ae40612SArnaldo Carvalho de Melo 		__u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
1130ae40612SArnaldo Carvalho de Melo 	} u;
1140ae40612SArnaldo Carvalho de Melo };
1150ae40612SArnaldo Carvalho de Melo 
116f65b9dbaSArnaldo Carvalho de Melo /*
117f65b9dbaSArnaldo Carvalho de Melo  * Payload of Linux keyring key of type "fscrypt-provisioning", referenced by
118f65b9dbaSArnaldo Carvalho de Melo  * fscrypt_add_key_arg::key_id as an alternative to fscrypt_add_key_arg::raw.
119f65b9dbaSArnaldo Carvalho de Melo  */
120f65b9dbaSArnaldo Carvalho de Melo struct fscrypt_provisioning_key_payload {
121f65b9dbaSArnaldo Carvalho de Melo 	__u32 type;
122f65b9dbaSArnaldo Carvalho de Melo 	__u32 __reserved;
123f65b9dbaSArnaldo Carvalho de Melo 	__u8 raw[];
124f65b9dbaSArnaldo Carvalho de Melo };
125f65b9dbaSArnaldo Carvalho de Melo 
1260ae40612SArnaldo Carvalho de Melo /* Struct passed to FS_IOC_ADD_ENCRYPTION_KEY */
1270ae40612SArnaldo Carvalho de Melo struct fscrypt_add_key_arg {
1280ae40612SArnaldo Carvalho de Melo 	struct fscrypt_key_specifier key_spec;
1290ae40612SArnaldo Carvalho de Melo 	__u32 raw_size;
130f65b9dbaSArnaldo Carvalho de Melo 	__u32 key_id;
131f65b9dbaSArnaldo Carvalho de Melo 	__u32 __reserved[8];
1320ae40612SArnaldo Carvalho de Melo 	__u8 raw[];
1330ae40612SArnaldo Carvalho de Melo };
1340ae40612SArnaldo Carvalho de Melo 
1350ae40612SArnaldo Carvalho de Melo /* Struct passed to FS_IOC_REMOVE_ENCRYPTION_KEY */
1360ae40612SArnaldo Carvalho de Melo struct fscrypt_remove_key_arg {
1370ae40612SArnaldo Carvalho de Melo 	struct fscrypt_key_specifier key_spec;
1380ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY	0x00000001
1390ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS	0x00000002
1400ae40612SArnaldo Carvalho de Melo 	__u32 removal_status_flags;	/* output */
1410ae40612SArnaldo Carvalho de Melo 	__u32 __reserved[5];
1420ae40612SArnaldo Carvalho de Melo };
1430ae40612SArnaldo Carvalho de Melo 
1440ae40612SArnaldo Carvalho de Melo /* Struct passed to FS_IOC_GET_ENCRYPTION_KEY_STATUS */
1450ae40612SArnaldo Carvalho de Melo struct fscrypt_get_key_status_arg {
1460ae40612SArnaldo Carvalho de Melo 	/* input */
1470ae40612SArnaldo Carvalho de Melo 	struct fscrypt_key_specifier key_spec;
1480ae40612SArnaldo Carvalho de Melo 	__u32 __reserved[6];
1490ae40612SArnaldo Carvalho de Melo 
1500ae40612SArnaldo Carvalho de Melo 	/* output */
1510ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_STATUS_ABSENT		1
1520ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_STATUS_PRESENT		2
1530ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED	3
1540ae40612SArnaldo Carvalho de Melo 	__u32 status;
1550ae40612SArnaldo Carvalho de Melo #define FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF   0x00000001
1560ae40612SArnaldo Carvalho de Melo 	__u32 status_flags;
1570ae40612SArnaldo Carvalho de Melo 	__u32 user_count;
1580ae40612SArnaldo Carvalho de Melo 	__u32 __out_reserved[13];
1590ae40612SArnaldo Carvalho de Melo };
1600ae40612SArnaldo Carvalho de Melo 
161d0448d6aSArnaldo Carvalho de Melo #define FS_IOC_SET_ENCRYPTION_POLICY		_IOR('f', 19, struct fscrypt_policy_v1)
1620ae40612SArnaldo Carvalho de Melo #define FS_IOC_GET_ENCRYPTION_PWSALT		_IOW('f', 20, __u8[16])
163d0448d6aSArnaldo Carvalho de Melo #define FS_IOC_GET_ENCRYPTION_POLICY		_IOW('f', 21, struct fscrypt_policy_v1)
1640ae40612SArnaldo Carvalho de Melo #define FS_IOC_GET_ENCRYPTION_POLICY_EX		_IOWR('f', 22, __u8[9]) /* size + version */
1650ae40612SArnaldo Carvalho de Melo #define FS_IOC_ADD_ENCRYPTION_KEY		_IOWR('f', 23, struct fscrypt_add_key_arg)
1660ae40612SArnaldo Carvalho de Melo #define FS_IOC_REMOVE_ENCRYPTION_KEY		_IOWR('f', 24, struct fscrypt_remove_key_arg)
1670ae40612SArnaldo Carvalho de Melo #define FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS	_IOWR('f', 25, struct fscrypt_remove_key_arg)
1680ae40612SArnaldo Carvalho de Melo #define FS_IOC_GET_ENCRYPTION_KEY_STATUS	_IOWR('f', 26, struct fscrypt_get_key_status_arg)
1691abcb9d9SArnaldo Carvalho de Melo #define FS_IOC_GET_ENCRYPTION_NONCE		_IOR('f', 27, __u8[16])
1700ae40612SArnaldo Carvalho de Melo 
1710ae40612SArnaldo Carvalho de Melo /**********************************************************************/
1720ae40612SArnaldo Carvalho de Melo 
1730ae40612SArnaldo Carvalho de Melo /* old names; don't add anything new here! */
1740ae40612SArnaldo Carvalho de Melo #ifndef __KERNEL__
175d0448d6aSArnaldo Carvalho de Melo #define fscrypt_policy			fscrypt_policy_v1
1760ae40612SArnaldo Carvalho de Melo #define FS_KEY_DESCRIPTOR_SIZE		FSCRYPT_KEY_DESCRIPTOR_SIZE
1770ae40612SArnaldo Carvalho de Melo #define FS_POLICY_FLAGS_PAD_4		FSCRYPT_POLICY_FLAGS_PAD_4
1780ae40612SArnaldo Carvalho de Melo #define FS_POLICY_FLAGS_PAD_8		FSCRYPT_POLICY_FLAGS_PAD_8
1790ae40612SArnaldo Carvalho de Melo #define FS_POLICY_FLAGS_PAD_16		FSCRYPT_POLICY_FLAGS_PAD_16
1800ae40612SArnaldo Carvalho de Melo #define FS_POLICY_FLAGS_PAD_32		FSCRYPT_POLICY_FLAGS_PAD_32
1810ae40612SArnaldo Carvalho de Melo #define FS_POLICY_FLAGS_PAD_MASK	FSCRYPT_POLICY_FLAGS_PAD_MASK
1820ae40612SArnaldo Carvalho de Melo #define FS_POLICY_FLAG_DIRECT_KEY	FSCRYPT_POLICY_FLAG_DIRECT_KEY
1834a443a51SArnaldo Carvalho de Melo #define FS_POLICY_FLAGS_VALID		0x07	/* contains old flags only */
1840ae40612SArnaldo Carvalho de Melo #define FS_ENCRYPTION_MODE_INVALID	0	/* never used */
1850ae40612SArnaldo Carvalho de Melo #define FS_ENCRYPTION_MODE_AES_256_XTS	FSCRYPT_MODE_AES_256_XTS
1860ae40612SArnaldo Carvalho de Melo #define FS_ENCRYPTION_MODE_AES_256_GCM	2	/* never used */
1870ae40612SArnaldo Carvalho de Melo #define FS_ENCRYPTION_MODE_AES_256_CBC	3	/* never used */
1880ae40612SArnaldo Carvalho de Melo #define FS_ENCRYPTION_MODE_AES_256_CTS	FSCRYPT_MODE_AES_256_CTS
1890ae40612SArnaldo Carvalho de Melo #define FS_ENCRYPTION_MODE_AES_128_CBC	FSCRYPT_MODE_AES_128_CBC
1900ae40612SArnaldo Carvalho de Melo #define FS_ENCRYPTION_MODE_AES_128_CTS	FSCRYPT_MODE_AES_128_CTS
1910ae40612SArnaldo Carvalho de Melo #define FS_ENCRYPTION_MODE_ADIANTUM	FSCRYPT_MODE_ADIANTUM
1920ae40612SArnaldo Carvalho de Melo #define FS_KEY_DESC_PREFIX		FSCRYPT_KEY_DESC_PREFIX
1930ae40612SArnaldo Carvalho de Melo #define FS_KEY_DESC_PREFIX_SIZE		FSCRYPT_KEY_DESC_PREFIX_SIZE
1940ae40612SArnaldo Carvalho de Melo #define FS_MAX_KEY_SIZE			FSCRYPT_MAX_KEY_SIZE
1950ae40612SArnaldo Carvalho de Melo #endif /* !__KERNEL__ */
1960ae40612SArnaldo Carvalho de Melo 
1970ae40612SArnaldo Carvalho de Melo #endif /* _UAPI_LINUX_FSCRYPT_H */
198