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