linux/include/uapi/linux/fscrypt.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
   2/*
   3 * fscrypt user API
   4 *
   5 * These ioctls can be used on filesystems that support fscrypt.  See the
   6 * "User API" section of Documentation/filesystems/fscrypt.rst.
   7 */
   8#ifndef _UAPI_LINUX_FSCRYPT_H
   9#define _UAPI_LINUX_FSCRYPT_H
  10
  11#include <linux/ioctl.h>
  12#include <linux/types.h>
  13
  14/* Encryption policy flags */
  15#define FSCRYPT_POLICY_FLAGS_PAD_4              0x00
  16#define FSCRYPT_POLICY_FLAGS_PAD_8              0x01
  17#define FSCRYPT_POLICY_FLAGS_PAD_16             0x02
  18#define FSCRYPT_POLICY_FLAGS_PAD_32             0x03
  19#define FSCRYPT_POLICY_FLAGS_PAD_MASK           0x03
  20#define FSCRYPT_POLICY_FLAG_DIRECT_KEY          0x04
  21#define FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64      0x08
  22#define FSCRYPT_POLICY_FLAGS_VALID              0x0F
  23
  24/* Encryption algorithms */
  25#define FSCRYPT_MODE_AES_256_XTS                1
  26#define FSCRYPT_MODE_AES_256_CTS                4
  27#define FSCRYPT_MODE_AES_128_CBC                5
  28#define FSCRYPT_MODE_AES_128_CTS                6
  29#define FSCRYPT_MODE_ADIANTUM                   9
  30#define __FSCRYPT_MODE_MAX                      9
  31
  32/*
  33 * Legacy policy version; ad-hoc KDF and no key verification.
  34 * For new encrypted directories, use fscrypt_policy_v2 instead.
  35 *
  36 * Careful: the .version field for this is actually 0, not 1.
  37 */
  38#define FSCRYPT_POLICY_V1               0
  39#define FSCRYPT_KEY_DESCRIPTOR_SIZE     8
  40struct fscrypt_policy_v1 {
  41        __u8 version;
  42        __u8 contents_encryption_mode;
  43        __u8 filenames_encryption_mode;
  44        __u8 flags;
  45        __u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
  46};
  47#define fscrypt_policy  fscrypt_policy_v1
  48
  49/*
  50 * Process-subscribed "logon" key description prefix and payload format.
  51 * Deprecated; prefer FS_IOC_ADD_ENCRYPTION_KEY instead.
  52 */
  53#define FSCRYPT_KEY_DESC_PREFIX         "fscrypt:"
  54#define FSCRYPT_KEY_DESC_PREFIX_SIZE    8
  55#define FSCRYPT_MAX_KEY_SIZE            64
  56struct fscrypt_key {
  57        __u32 mode;
  58        __u8 raw[FSCRYPT_MAX_KEY_SIZE];
  59        __u32 size;
  60};
  61
  62/*
  63 * New policy version with HKDF and key verification (recommended).
  64 */
  65#define FSCRYPT_POLICY_V2               2
  66#define FSCRYPT_KEY_IDENTIFIER_SIZE     16
  67struct fscrypt_policy_v2 {
  68        __u8 version;
  69        __u8 contents_encryption_mode;
  70        __u8 filenames_encryption_mode;
  71        __u8 flags;
  72        __u8 __reserved[4];
  73        __u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
  74};
  75
  76/* Struct passed to FS_IOC_GET_ENCRYPTION_POLICY_EX */
  77struct fscrypt_get_policy_ex_arg {
  78        __u64 policy_size; /* input/output */
  79        union {
  80                __u8 version;
  81                struct fscrypt_policy_v1 v1;
  82                struct fscrypt_policy_v2 v2;
  83        } policy; /* output */
  84};
  85
  86/*
  87 * v1 policy keys are specified by an arbitrary 8-byte key "descriptor",
  88 * matching fscrypt_policy_v1::master_key_descriptor.
  89 */
  90#define FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR        1
  91
  92/*
  93 * v2 policy keys are specified by a 16-byte key "identifier" which the kernel
  94 * calculates as a cryptographic hash of the key itself,
  95 * matching fscrypt_policy_v2::master_key_identifier.
  96 */
  97#define FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER        2
  98
  99/*
 100 * Specifies a key, either for v1 or v2 policies.  This doesn't contain the
 101 * actual key itself; this is just the "name" of the key.
 102 */
 103struct fscrypt_key_specifier {
 104        __u32 type;     /* one of FSCRYPT_KEY_SPEC_TYPE_* */
 105        __u32 __reserved;
 106        union {
 107                __u8 __reserved[32]; /* reserve some extra space */
 108                __u8 descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE];
 109                __u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE];
 110        } u;
 111};
 112
 113/*
 114 * Payload of Linux keyring key of type "fscrypt-provisioning", referenced by
 115 * fscrypt_add_key_arg::key_id as an alternative to fscrypt_add_key_arg::raw.
 116 */
 117struct fscrypt_provisioning_key_payload {
 118        __u32 type;
 119        __u32 __reserved;
 120        __u8 raw[];
 121};
 122
 123/* Struct passed to FS_IOC_ADD_ENCRYPTION_KEY */
 124struct fscrypt_add_key_arg {
 125        struct fscrypt_key_specifier key_spec;
 126        __u32 raw_size;
 127        __u32 key_id;
 128        __u32 __reserved[8];
 129        __u8 raw[];
 130};
 131
 132/* Struct passed to FS_IOC_REMOVE_ENCRYPTION_KEY */
 133struct fscrypt_remove_key_arg {
 134        struct fscrypt_key_specifier key_spec;
 135#define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY      0x00000001
 136#define FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS     0x00000002
 137        __u32 removal_status_flags;     /* output */
 138        __u32 __reserved[5];
 139};
 140
 141/* Struct passed to FS_IOC_GET_ENCRYPTION_KEY_STATUS */
 142struct fscrypt_get_key_status_arg {
 143        /* input */
 144        struct fscrypt_key_specifier key_spec;
 145        __u32 __reserved[6];
 146
 147        /* output */
 148#define FSCRYPT_KEY_STATUS_ABSENT               1
 149#define FSCRYPT_KEY_STATUS_PRESENT              2
 150#define FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED 3
 151        __u32 status;
 152#define FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF   0x00000001
 153        __u32 status_flags;
 154        __u32 user_count;
 155        __u32 __out_reserved[13];
 156};
 157
 158#define FS_IOC_SET_ENCRYPTION_POLICY            _IOR('f', 19, struct fscrypt_policy)
 159#define FS_IOC_GET_ENCRYPTION_PWSALT            _IOW('f', 20, __u8[16])
 160#define FS_IOC_GET_ENCRYPTION_POLICY            _IOW('f', 21, struct fscrypt_policy)
 161#define FS_IOC_GET_ENCRYPTION_POLICY_EX         _IOWR('f', 22, __u8[9]) /* size + version */
 162#define FS_IOC_ADD_ENCRYPTION_KEY               _IOWR('f', 23, struct fscrypt_add_key_arg)
 163#define FS_IOC_REMOVE_ENCRYPTION_KEY            _IOWR('f', 24, struct fscrypt_remove_key_arg)
 164#define FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS  _IOWR('f', 25, struct fscrypt_remove_key_arg)
 165#define FS_IOC_GET_ENCRYPTION_KEY_STATUS        _IOWR('f', 26, struct fscrypt_get_key_status_arg)
 166
 167/**********************************************************************/
 168
 169/* old names; don't add anything new here! */
 170#ifndef __KERNEL__
 171#define FS_KEY_DESCRIPTOR_SIZE          FSCRYPT_KEY_DESCRIPTOR_SIZE
 172#define FS_POLICY_FLAGS_PAD_4           FSCRYPT_POLICY_FLAGS_PAD_4
 173#define FS_POLICY_FLAGS_PAD_8           FSCRYPT_POLICY_FLAGS_PAD_8
 174#define FS_POLICY_FLAGS_PAD_16          FSCRYPT_POLICY_FLAGS_PAD_16
 175#define FS_POLICY_FLAGS_PAD_32          FSCRYPT_POLICY_FLAGS_PAD_32
 176#define FS_POLICY_FLAGS_PAD_MASK        FSCRYPT_POLICY_FLAGS_PAD_MASK
 177#define FS_POLICY_FLAG_DIRECT_KEY       FSCRYPT_POLICY_FLAG_DIRECT_KEY
 178#define FS_POLICY_FLAGS_VALID           FSCRYPT_POLICY_FLAGS_VALID
 179#define FS_ENCRYPTION_MODE_INVALID      0       /* never used */
 180#define FS_ENCRYPTION_MODE_AES_256_XTS  FSCRYPT_MODE_AES_256_XTS
 181#define FS_ENCRYPTION_MODE_AES_256_GCM  2       /* never used */
 182#define FS_ENCRYPTION_MODE_AES_256_CBC  3       /* never used */
 183#define FS_ENCRYPTION_MODE_AES_256_CTS  FSCRYPT_MODE_AES_256_CTS
 184#define FS_ENCRYPTION_MODE_AES_128_CBC  FSCRYPT_MODE_AES_128_CBC
 185#define FS_ENCRYPTION_MODE_AES_128_CTS  FSCRYPT_MODE_AES_128_CTS
 186#define FS_ENCRYPTION_MODE_SPECK128_256_XTS     7       /* removed */
 187#define FS_ENCRYPTION_MODE_SPECK128_256_CTS     8       /* removed */
 188#define FS_ENCRYPTION_MODE_ADIANTUM     FSCRYPT_MODE_ADIANTUM
 189#define FS_KEY_DESC_PREFIX              FSCRYPT_KEY_DESC_PREFIX
 190#define FS_KEY_DESC_PREFIX_SIZE         FSCRYPT_KEY_DESC_PREFIX_SIZE
 191#define FS_MAX_KEY_SIZE                 FSCRYPT_MAX_KEY_SIZE
 192#endif /* !__KERNEL__ */
 193
 194#endif /* _UAPI_LINUX_FSCRYPT_H */
 195