1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 23325bea5STheodore Ts'o /* 33325bea5STheodore Ts'o * fscrypt_private.h 43325bea5STheodore Ts'o * 53325bea5STheodore Ts'o * Copyright (C) 2015, Google, Inc. 63325bea5STheodore Ts'o * 73ec4f2a6SEric Biggers * Originally written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar. 83ec4f2a6SEric Biggers * Heavily modified since then. 93325bea5STheodore Ts'o */ 103325bea5STheodore Ts'o 113325bea5STheodore Ts'o #ifndef _FSCRYPT_PRIVATE_H 123325bea5STheodore Ts'o #define _FSCRYPT_PRIVATE_H 133325bea5STheodore Ts'o 14734f0d24SDave Chinner #include <linux/fscrypt.h> 15aa408f83SDaniel Rosenberg #include <linux/siphash.h> 16b7e7cf7aSDaniel Walter #include <crypto/hash.h> 175fee3609SSatya Tangirala #include <linux/blk-crypto.h> 183325bea5STheodore Ts'o 1922d94f49SEric Biggers #define CONST_STRLEN(str) (sizeof(str) - 1) 2022d94f49SEric Biggers 21cc4e0df0STheodore Ts'o #define FS_KEY_DERIVATION_NONCE_SIZE 16 22cc4e0df0STheodore Ts'o 2322d94f49SEric Biggers #define FSCRYPT_MIN_KEY_SIZE 16 2422d94f49SEric Biggers 255dae460cSEric Biggers #define FSCRYPT_CONTEXT_V1 1 265dae460cSEric Biggers #define FSCRYPT_CONTEXT_V2 2 275dae460cSEric Biggers 285dae460cSEric Biggers struct fscrypt_context_v1 { 295dae460cSEric Biggers u8 version; /* FSCRYPT_CONTEXT_V1 */ 30cc4e0df0STheodore Ts'o u8 contents_encryption_mode; 31cc4e0df0STheodore Ts'o u8 filenames_encryption_mode; 32cc4e0df0STheodore Ts'o u8 flags; 333b6df59bSEric Biggers u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE]; 34cc4e0df0STheodore Ts'o u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE]; 355dae460cSEric Biggers }; 36cc4e0df0STheodore Ts'o 375dae460cSEric Biggers struct fscrypt_context_v2 { 385dae460cSEric Biggers u8 version; /* FSCRYPT_CONTEXT_V2 */ 395dae460cSEric Biggers u8 contents_encryption_mode; 405dae460cSEric Biggers u8 filenames_encryption_mode; 415dae460cSEric Biggers u8 flags; 425dae460cSEric Biggers u8 __reserved[4]; 435dae460cSEric Biggers u8 master_key_identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]; 445dae460cSEric Biggers u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE]; 455dae460cSEric Biggers }; 465dae460cSEric Biggers 47d2fe9754SEric Biggers /* 485dae460cSEric Biggers * fscrypt_context - the encryption context of an inode 495dae460cSEric Biggers * 505dae460cSEric Biggers * This is the on-disk equivalent of an fscrypt_policy, stored alongside each 515dae460cSEric Biggers * encrypted file usually in a hidden extended attribute. It contains the 525dae460cSEric Biggers * fields from the fscrypt_policy, in order to identify the encryption algorithm 535dae460cSEric Biggers * and key with which the file is encrypted. It also contains a nonce that was 545dae460cSEric Biggers * randomly generated by fscrypt itself; this is used as KDF input or as a tweak 555dae460cSEric Biggers * to cause different files to be encrypted differently. 565dae460cSEric Biggers */ 575dae460cSEric Biggers union fscrypt_context { 585dae460cSEric Biggers u8 version; 595dae460cSEric Biggers struct fscrypt_context_v1 v1; 605dae460cSEric Biggers struct fscrypt_context_v2 v2; 615dae460cSEric Biggers }; 625dae460cSEric Biggers 635dae460cSEric Biggers /* 645dae460cSEric Biggers * Return the size expected for the given fscrypt_context based on its version 655dae460cSEric Biggers * number, or 0 if the context version is unrecognized. 665dae460cSEric Biggers */ 675dae460cSEric Biggers static inline int fscrypt_context_size(const union fscrypt_context *ctx) 685dae460cSEric Biggers { 695dae460cSEric Biggers switch (ctx->version) { 705dae460cSEric Biggers case FSCRYPT_CONTEXT_V1: 715dae460cSEric Biggers BUILD_BUG_ON(sizeof(ctx->v1) != 28); 725dae460cSEric Biggers return sizeof(ctx->v1); 735dae460cSEric Biggers case FSCRYPT_CONTEXT_V2: 745dae460cSEric Biggers BUILD_BUG_ON(sizeof(ctx->v2) != 40); 755dae460cSEric Biggers return sizeof(ctx->v2); 765dae460cSEric Biggers } 775dae460cSEric Biggers return 0; 785dae460cSEric Biggers } 795dae460cSEric Biggers 80e98ad464SEric Biggers /* Check whether an fscrypt_context has a recognized version number and size */ 81e98ad464SEric Biggers static inline bool fscrypt_context_is_valid(const union fscrypt_context *ctx, 82e98ad464SEric Biggers int ctx_size) 83e98ad464SEric Biggers { 84e98ad464SEric Biggers return ctx_size >= 1 && ctx_size == fscrypt_context_size(ctx); 85e98ad464SEric Biggers } 86e98ad464SEric Biggers 87e98ad464SEric Biggers /* Retrieve the context's nonce, assuming the context was already validated */ 88e98ad464SEric Biggers static inline const u8 *fscrypt_context_nonce(const union fscrypt_context *ctx) 89e98ad464SEric Biggers { 90e98ad464SEric Biggers switch (ctx->version) { 91e98ad464SEric Biggers case FSCRYPT_CONTEXT_V1: 92e98ad464SEric Biggers return ctx->v1.nonce; 93e98ad464SEric Biggers case FSCRYPT_CONTEXT_V2: 94e98ad464SEric Biggers return ctx->v2.nonce; 95e98ad464SEric Biggers } 96e98ad464SEric Biggers WARN_ON(1); 97e98ad464SEric Biggers return NULL; 98e98ad464SEric Biggers } 99e98ad464SEric Biggers 1005dae460cSEric Biggers #undef fscrypt_policy 1015dae460cSEric Biggers union fscrypt_policy { 1025dae460cSEric Biggers u8 version; 1035dae460cSEric Biggers struct fscrypt_policy_v1 v1; 1045dae460cSEric Biggers struct fscrypt_policy_v2 v2; 1055dae460cSEric Biggers }; 1065dae460cSEric Biggers 1075dae460cSEric Biggers /* 1085dae460cSEric Biggers * Return the size expected for the given fscrypt_policy based on its version 1095dae460cSEric Biggers * number, or 0 if the policy version is unrecognized. 1105dae460cSEric Biggers */ 1115dae460cSEric Biggers static inline int fscrypt_policy_size(const union fscrypt_policy *policy) 1125dae460cSEric Biggers { 1135dae460cSEric Biggers switch (policy->version) { 1145dae460cSEric Biggers case FSCRYPT_POLICY_V1: 1155dae460cSEric Biggers return sizeof(policy->v1); 1165dae460cSEric Biggers case FSCRYPT_POLICY_V2: 1175dae460cSEric Biggers return sizeof(policy->v2); 1185dae460cSEric Biggers } 1195dae460cSEric Biggers return 0; 1205dae460cSEric Biggers } 1215dae460cSEric Biggers 1225dae460cSEric Biggers /* Return the contents encryption mode of a valid encryption policy */ 1235dae460cSEric Biggers static inline u8 1245dae460cSEric Biggers fscrypt_policy_contents_mode(const union fscrypt_policy *policy) 1255dae460cSEric Biggers { 1265dae460cSEric Biggers switch (policy->version) { 1275dae460cSEric Biggers case FSCRYPT_POLICY_V1: 1285dae460cSEric Biggers return policy->v1.contents_encryption_mode; 1295dae460cSEric Biggers case FSCRYPT_POLICY_V2: 1305dae460cSEric Biggers return policy->v2.contents_encryption_mode; 1315dae460cSEric Biggers } 1325dae460cSEric Biggers BUG(); 1335dae460cSEric Biggers } 1345dae460cSEric Biggers 1355dae460cSEric Biggers /* Return the filenames encryption mode of a valid encryption policy */ 1365dae460cSEric Biggers static inline u8 1375dae460cSEric Biggers fscrypt_policy_fnames_mode(const union fscrypt_policy *policy) 1385dae460cSEric Biggers { 1395dae460cSEric Biggers switch (policy->version) { 1405dae460cSEric Biggers case FSCRYPT_POLICY_V1: 1415dae460cSEric Biggers return policy->v1.filenames_encryption_mode; 1425dae460cSEric Biggers case FSCRYPT_POLICY_V2: 1435dae460cSEric Biggers return policy->v2.filenames_encryption_mode; 1445dae460cSEric Biggers } 1455dae460cSEric Biggers BUG(); 1465dae460cSEric Biggers } 1475dae460cSEric Biggers 1485dae460cSEric Biggers /* Return the flags (FSCRYPT_POLICY_FLAG*) of a valid encryption policy */ 1495dae460cSEric Biggers static inline u8 1505dae460cSEric Biggers fscrypt_policy_flags(const union fscrypt_policy *policy) 1515dae460cSEric Biggers { 1525dae460cSEric Biggers switch (policy->version) { 1535dae460cSEric Biggers case FSCRYPT_POLICY_V1: 1545dae460cSEric Biggers return policy->v1.flags; 1555dae460cSEric Biggers case FSCRYPT_POLICY_V2: 1565dae460cSEric Biggers return policy->v2.flags; 1575dae460cSEric Biggers } 1585dae460cSEric Biggers BUG(); 1595dae460cSEric Biggers } 1605dae460cSEric Biggers 161d2fe9754SEric Biggers /* 1620eaab5b1SEric Biggers * For encrypted symlinks, the ciphertext length is stored at the beginning 1630eaab5b1SEric Biggers * of the string in little-endian format. 1640eaab5b1SEric Biggers */ 1650eaab5b1SEric Biggers struct fscrypt_symlink_data { 1660eaab5b1SEric Biggers __le16 len; 1670eaab5b1SEric Biggers char encrypted_path[1]; 1680eaab5b1SEric Biggers } __packed; 1690eaab5b1SEric Biggers 1705fee3609SSatya Tangirala /** 1715fee3609SSatya Tangirala * struct fscrypt_prepared_key - a key prepared for actual encryption/decryption 1725fee3609SSatya Tangirala * @tfm: crypto API transform object 1735fee3609SSatya Tangirala * @blk_key: key for blk-crypto 1745fee3609SSatya Tangirala * 1755fee3609SSatya Tangirala * Normally only one of the fields will be non-NULL. 1765fee3609SSatya Tangirala */ 1775fee3609SSatya Tangirala struct fscrypt_prepared_key { 1785fee3609SSatya Tangirala struct crypto_skcipher *tfm; 1795fee3609SSatya Tangirala #ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT 1805fee3609SSatya Tangirala struct fscrypt_blk_crypto_key *blk_key; 1815fee3609SSatya Tangirala #endif 1825fee3609SSatya Tangirala }; 1835fee3609SSatya Tangirala 184cc4e0df0STheodore Ts'o /* 1858094c3ceSEric Biggers * fscrypt_info - the "encryption key" for an inode 1868094c3ceSEric Biggers * 1878094c3ceSEric Biggers * When an encrypted file's key is made available, an instance of this struct is 1888094c3ceSEric Biggers * allocated and stored in ->i_crypt_info. Once created, it remains until the 1898094c3ceSEric Biggers * inode is evicted. 190cc4e0df0STheodore Ts'o */ 191cc4e0df0STheodore Ts'o struct fscrypt_info { 1928094c3ceSEric Biggers 1935fee3609SSatya Tangirala /* The key in a form prepared for actual encryption/decryption */ 1945fee3609SSatya Tangirala struct fscrypt_prepared_key ci_enc_key; 1958094c3ceSEric Biggers 1965fee3609SSatya Tangirala /* True if ci_enc_key should be freed when this fscrypt_info is freed */ 197b103fb76SEric Biggers bool ci_owns_key; 198b103fb76SEric Biggers 1995fee3609SSatya Tangirala #ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT 2005fee3609SSatya Tangirala /* 2015fee3609SSatya Tangirala * True if this inode will use inline encryption (blk-crypto) instead of 2025fee3609SSatya Tangirala * the traditional filesystem-layer encryption. 2035fee3609SSatya Tangirala */ 2045fee3609SSatya Tangirala bool ci_inlinecrypt; 2055fee3609SSatya Tangirala #endif 2065fee3609SSatya Tangirala 2078094c3ceSEric Biggers /* 2085dae460cSEric Biggers * Encryption mode used for this inode. It corresponds to either the 2095dae460cSEric Biggers * contents or filenames encryption mode, depending on the inode type. 2108094c3ceSEric Biggers */ 2118094c3ceSEric Biggers struct fscrypt_mode *ci_mode; 2128094c3ceSEric Biggers 21359dc6a8eSEric Biggers /* Back-pointer to the inode */ 21459dc6a8eSEric Biggers struct inode *ci_inode; 21559dc6a8eSEric Biggers 2168094c3ceSEric Biggers /* 217b1c0ec35SEric Biggers * The master key with which this inode was unlocked (decrypted). This 218b1c0ec35SEric Biggers * will be NULL if the master key was found in a process-subscribed 219b1c0ec35SEric Biggers * keyring rather than in the filesystem-level keyring. 220b1c0ec35SEric Biggers */ 221b1c0ec35SEric Biggers struct key *ci_master_key; 222b1c0ec35SEric Biggers 223b1c0ec35SEric Biggers /* 224b1c0ec35SEric Biggers * Link in list of inodes that were unlocked with the master key. 225b1c0ec35SEric Biggers * Only used when ->ci_master_key is set. 226b1c0ec35SEric Biggers */ 227b1c0ec35SEric Biggers struct list_head ci_master_key_link; 228b1c0ec35SEric Biggers 229b1c0ec35SEric Biggers /* 230a828daabSEric Biggers * If non-NULL, then encryption is done using the master key directly 2315fee3609SSatya Tangirala * and ci_enc_key will equal ci_direct_key->dk_key. 2328094c3ceSEric Biggers */ 233a828daabSEric Biggers struct fscrypt_direct_key *ci_direct_key; 2348094c3ceSEric Biggers 235aa408f83SDaniel Rosenberg /* 236aa408f83SDaniel Rosenberg * This inode's hash key for filenames. This is a 128-bit SipHash-2-4 237aa408f83SDaniel Rosenberg * key. This is only set for directories that use a keyed dirhash over 238aa408f83SDaniel Rosenberg * the plaintext filenames -- currently just casefolded directories. 239aa408f83SDaniel Rosenberg */ 240aa408f83SDaniel Rosenberg siphash_key_t ci_dirhash_key; 241aa408f83SDaniel Rosenberg bool ci_dirhash_key_initialized; 242aa408f83SDaniel Rosenberg 2435dae460cSEric Biggers /* The encryption policy used by this inode */ 2445dae460cSEric Biggers union fscrypt_policy ci_policy; 2455dae460cSEric Biggers 2465dae460cSEric Biggers /* This inode's nonce, copied from the fscrypt_context */ 2478094c3ceSEric Biggers u8 ci_nonce[FS_KEY_DERIVATION_NONCE_SIZE]; 248e3b1078bSEric Biggers 249e3b1078bSEric Biggers /* Hashed inode number. Only set for IV_INO_LBLK_32 */ 250e3b1078bSEric Biggers u32 ci_hashed_ino; 251cc4e0df0STheodore Ts'o }; 252cc4e0df0STheodore Ts'o 25358ae7468SRichard Weinberger typedef enum { 25458ae7468SRichard Weinberger FS_DECRYPT = 0, 25558ae7468SRichard Weinberger FS_ENCRYPT, 25658ae7468SRichard Weinberger } fscrypt_direction_t; 25758ae7468SRichard Weinberger 258b98701dfSTheodore Ts'o /* crypto.c */ 259e4de782aSEric Biggers extern struct kmem_cache *fscrypt_info_cachep; 26060700902SEric Biggers int fscrypt_initialize(unsigned int cop_flags); 26160700902SEric Biggers int fscrypt_crypt_block(const struct inode *inode, fscrypt_direction_t rw, 26260700902SEric Biggers u64 lblk_num, struct page *src_page, 26360700902SEric Biggers struct page *dest_page, unsigned int len, 26460700902SEric Biggers unsigned int offs, gfp_t gfp_flags); 26560700902SEric Biggers struct page *fscrypt_alloc_bounce_page(gfp_t gfp_flags); 266b98701dfSTheodore Ts'o 26760700902SEric Biggers void __printf(3, 4) __cold 268886da8b3SEric Biggers fscrypt_msg(const struct inode *inode, const char *level, const char *fmt, ...); 269544d08fdSEric Biggers 270886da8b3SEric Biggers #define fscrypt_warn(inode, fmt, ...) \ 271886da8b3SEric Biggers fscrypt_msg((inode), KERN_WARNING, fmt, ##__VA_ARGS__) 272886da8b3SEric Biggers #define fscrypt_err(inode, fmt, ...) \ 273886da8b3SEric Biggers fscrypt_msg((inode), KERN_ERR, fmt, ##__VA_ARGS__) 274544d08fdSEric Biggers 2758094c3ceSEric Biggers #define FSCRYPT_MAX_IV_SIZE 32 2768094c3ceSEric Biggers 2778094c3ceSEric Biggers union fscrypt_iv { 2788094c3ceSEric Biggers struct { 2798094c3ceSEric Biggers /* logical block number within the file */ 2808094c3ceSEric Biggers __le64 lblk_num; 2818094c3ceSEric Biggers 2828094c3ceSEric Biggers /* per-file nonce; only set in DIRECT_KEY mode */ 2838094c3ceSEric Biggers u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE]; 2848094c3ceSEric Biggers }; 2858094c3ceSEric Biggers u8 raw[FSCRYPT_MAX_IV_SIZE]; 2865fee3609SSatya Tangirala __le64 dun[FSCRYPT_MAX_IV_SIZE / sizeof(__le64)]; 2878094c3ceSEric Biggers }; 2888094c3ceSEric Biggers 2898094c3ceSEric Biggers void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num, 2908094c3ceSEric Biggers const struct fscrypt_info *ci); 2918094c3ceSEric Biggers 29276e81d6dSEric Biggers /* fname.c */ 29360700902SEric Biggers int fscrypt_fname_encrypt(const struct inode *inode, const struct qstr *iname, 29450c961deSEric Biggers u8 *out, unsigned int olen); 29560700902SEric Biggers bool fscrypt_fname_encrypted_size(const struct inode *inode, u32 orig_len, 29660700902SEric Biggers u32 max_len, u32 *encrypted_len_ret); 2972ebdef6dSEric Biggers extern const struct dentry_operations fscrypt_d_ops; 29876e81d6dSEric Biggers 299c1144c9bSEric Biggers /* hkdf.c */ 300c1144c9bSEric Biggers 301c1144c9bSEric Biggers struct fscrypt_hkdf { 302c1144c9bSEric Biggers struct crypto_shash *hmac_tfm; 303c1144c9bSEric Biggers }; 304c1144c9bSEric Biggers 30560700902SEric Biggers int fscrypt_init_hkdf(struct fscrypt_hkdf *hkdf, const u8 *master_key, 306c1144c9bSEric Biggers unsigned int master_key_size); 307c1144c9bSEric Biggers 3085dae460cSEric Biggers /* 3095dae460cSEric Biggers * The list of contexts in which fscrypt uses HKDF. These values are used as 3105dae460cSEric Biggers * the first byte of the HKDF application-specific info string to guarantee that 3115dae460cSEric Biggers * info strings are never repeated between contexts. This ensures that all HKDF 3125dae460cSEric Biggers * outputs are unique and cryptographically isolated, i.e. knowledge of one 3135dae460cSEric Biggers * output doesn't reveal another. 3145dae460cSEric Biggers */ 315*e455de31SEric Biggers #define HKDF_CONTEXT_KEY_IDENTIFIER 1 /* info=<empty> */ 316*e455de31SEric Biggers #define HKDF_CONTEXT_PER_FILE_ENC_KEY 2 /* info=file_nonce */ 317*e455de31SEric Biggers #define HKDF_CONTEXT_DIRECT_KEY 3 /* info=mode_num */ 318*e455de31SEric Biggers #define HKDF_CONTEXT_IV_INO_LBLK_64_KEY 4 /* info=mode_num||fs_uuid */ 319*e455de31SEric Biggers #define HKDF_CONTEXT_DIRHASH_KEY 5 /* info=file_nonce */ 320*e455de31SEric Biggers #define HKDF_CONTEXT_IV_INO_LBLK_32_KEY 6 /* info=mode_num||fs_uuid */ 321*e455de31SEric Biggers #define HKDF_CONTEXT_INODE_HASH_KEY 7 /* info=<empty> */ 3225dae460cSEric Biggers 32360700902SEric Biggers int fscrypt_hkdf_expand(const struct fscrypt_hkdf *hkdf, u8 context, 324c1144c9bSEric Biggers const u8 *info, unsigned int infolen, 325c1144c9bSEric Biggers u8 *okm, unsigned int okmlen); 326c1144c9bSEric Biggers 32760700902SEric Biggers void fscrypt_destroy_hkdf(struct fscrypt_hkdf *hkdf); 328c1144c9bSEric Biggers 3295fee3609SSatya Tangirala /* inline_crypt.c */ 3305fee3609SSatya Tangirala #ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT 3315fee3609SSatya Tangirala int fscrypt_select_encryption_impl(struct fscrypt_info *ci); 3325fee3609SSatya Tangirala 3335fee3609SSatya Tangirala static inline bool 3345fee3609SSatya Tangirala fscrypt_using_inline_encryption(const struct fscrypt_info *ci) 3355fee3609SSatya Tangirala { 3365fee3609SSatya Tangirala return ci->ci_inlinecrypt; 3375fee3609SSatya Tangirala } 3385fee3609SSatya Tangirala 3395fee3609SSatya Tangirala int fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key, 3405fee3609SSatya Tangirala const u8 *raw_key, 3415fee3609SSatya Tangirala const struct fscrypt_info *ci); 3425fee3609SSatya Tangirala 3435fee3609SSatya Tangirala void fscrypt_destroy_inline_crypt_key(struct fscrypt_prepared_key *prep_key); 3445fee3609SSatya Tangirala 3455fee3609SSatya Tangirala /* 3465fee3609SSatya Tangirala * Check whether the crypto transform or blk-crypto key has been allocated in 3475fee3609SSatya Tangirala * @prep_key, depending on which encryption implementation the file will use. 3485fee3609SSatya Tangirala */ 3495fee3609SSatya Tangirala static inline bool 3505fee3609SSatya Tangirala fscrypt_is_key_prepared(struct fscrypt_prepared_key *prep_key, 3515fee3609SSatya Tangirala const struct fscrypt_info *ci) 3525fee3609SSatya Tangirala { 3535fee3609SSatya Tangirala /* 3545fee3609SSatya Tangirala * The READ_ONCE() here pairs with the smp_store_release() in 3555fee3609SSatya Tangirala * fscrypt_prepare_key(). (This only matters for the per-mode keys, 3565fee3609SSatya Tangirala * which are shared by multiple inodes.) 3575fee3609SSatya Tangirala */ 3585fee3609SSatya Tangirala if (fscrypt_using_inline_encryption(ci)) 3595fee3609SSatya Tangirala return READ_ONCE(prep_key->blk_key) != NULL; 3605fee3609SSatya Tangirala return READ_ONCE(prep_key->tfm) != NULL; 3615fee3609SSatya Tangirala } 3625fee3609SSatya Tangirala 3635fee3609SSatya Tangirala #else /* CONFIG_FS_ENCRYPTION_INLINE_CRYPT */ 3645fee3609SSatya Tangirala 3655fee3609SSatya Tangirala static inline int fscrypt_select_encryption_impl(struct fscrypt_info *ci) 3665fee3609SSatya Tangirala { 3675fee3609SSatya Tangirala return 0; 3685fee3609SSatya Tangirala } 3695fee3609SSatya Tangirala 3705fee3609SSatya Tangirala static inline bool 3715fee3609SSatya Tangirala fscrypt_using_inline_encryption(const struct fscrypt_info *ci) 3725fee3609SSatya Tangirala { 3735fee3609SSatya Tangirala return false; 3745fee3609SSatya Tangirala } 3755fee3609SSatya Tangirala 3765fee3609SSatya Tangirala static inline int 3775fee3609SSatya Tangirala fscrypt_prepare_inline_crypt_key(struct fscrypt_prepared_key *prep_key, 3785fee3609SSatya Tangirala const u8 *raw_key, 3795fee3609SSatya Tangirala const struct fscrypt_info *ci) 3805fee3609SSatya Tangirala { 3815fee3609SSatya Tangirala WARN_ON(1); 3825fee3609SSatya Tangirala return -EOPNOTSUPP; 3835fee3609SSatya Tangirala } 3845fee3609SSatya Tangirala 3855fee3609SSatya Tangirala static inline void 3865fee3609SSatya Tangirala fscrypt_destroy_inline_crypt_key(struct fscrypt_prepared_key *prep_key) 3875fee3609SSatya Tangirala { 3885fee3609SSatya Tangirala } 3895fee3609SSatya Tangirala 3905fee3609SSatya Tangirala static inline bool 3915fee3609SSatya Tangirala fscrypt_is_key_prepared(struct fscrypt_prepared_key *prep_key, 3925fee3609SSatya Tangirala const struct fscrypt_info *ci) 3935fee3609SSatya Tangirala { 3945fee3609SSatya Tangirala return READ_ONCE(prep_key->tfm) != NULL; 3955fee3609SSatya Tangirala } 3965fee3609SSatya Tangirala #endif /* !CONFIG_FS_ENCRYPTION_INLINE_CRYPT */ 3975fee3609SSatya Tangirala 39822d94f49SEric Biggers /* keyring.c */ 39922d94f49SEric Biggers 40022d94f49SEric Biggers /* 40122d94f49SEric Biggers * fscrypt_master_key_secret - secret key material of an in-use master key 40222d94f49SEric Biggers */ 40322d94f49SEric Biggers struct fscrypt_master_key_secret { 40422d94f49SEric Biggers 4055dae460cSEric Biggers /* 4065dae460cSEric Biggers * For v2 policy keys: HKDF context keyed by this master key. 4075dae460cSEric Biggers * For v1 policy keys: not set (hkdf.hmac_tfm == NULL). 4085dae460cSEric Biggers */ 4095dae460cSEric Biggers struct fscrypt_hkdf hkdf; 4105dae460cSEric Biggers 4115dae460cSEric Biggers /* Size of the raw key in bytes. Set even if ->raw isn't set. */ 41222d94f49SEric Biggers u32 size; 41322d94f49SEric Biggers 4145dae460cSEric Biggers /* For v1 policy keys: the raw key. Wiped for v2 policy keys. */ 41522d94f49SEric Biggers u8 raw[FSCRYPT_MAX_KEY_SIZE]; 41622d94f49SEric Biggers 41722d94f49SEric Biggers } __randomize_layout; 41822d94f49SEric Biggers 41922d94f49SEric Biggers /* 42022d94f49SEric Biggers * fscrypt_master_key - an in-use master key 42122d94f49SEric Biggers * 42222d94f49SEric Biggers * This represents a master encryption key which has been added to the 42322d94f49SEric Biggers * filesystem and can be used to "unlock" the encrypted files which were 42422d94f49SEric Biggers * encrypted with it. 42522d94f49SEric Biggers */ 42622d94f49SEric Biggers struct fscrypt_master_key { 42722d94f49SEric Biggers 428b1c0ec35SEric Biggers /* 429b1c0ec35SEric Biggers * The secret key material. After FS_IOC_REMOVE_ENCRYPTION_KEY is 430b1c0ec35SEric Biggers * executed, this is wiped and no new inodes can be unlocked with this 431b1c0ec35SEric Biggers * key; however, there may still be inodes in ->mk_decrypted_inodes 432b1c0ec35SEric Biggers * which could not be evicted. As long as some inodes still remain, 433b1c0ec35SEric Biggers * FS_IOC_REMOVE_ENCRYPTION_KEY can be retried, or 434b1c0ec35SEric Biggers * FS_IOC_ADD_ENCRYPTION_KEY can add the secret again. 435b1c0ec35SEric Biggers * 43623c688b5SEric Biggers * Locking: protected by key->sem (outer) and mk_secret_sem (inner). 43723c688b5SEric Biggers * The reason for two locks is that key->sem also protects modifying 43823c688b5SEric Biggers * mk_users, which ranks it above the semaphore for the keyring key 43923c688b5SEric Biggers * type, which is in turn above page faults (via keyring_read). But 44023c688b5SEric Biggers * sometimes filesystems call fscrypt_get_encryption_info() from within 44123c688b5SEric Biggers * a transaction, which ranks it below page faults. So we need a 44223c688b5SEric Biggers * separate lock which protects mk_secret but not also mk_users. 443b1c0ec35SEric Biggers */ 44422d94f49SEric Biggers struct fscrypt_master_key_secret mk_secret; 44523c688b5SEric Biggers struct rw_semaphore mk_secret_sem; 44622d94f49SEric Biggers 4475dae460cSEric Biggers /* 4485dae460cSEric Biggers * For v1 policy keys: an arbitrary key descriptor which was assigned by 4495dae460cSEric Biggers * userspace (->descriptor). 4505dae460cSEric Biggers * 4515dae460cSEric Biggers * For v2 policy keys: a cryptographic hash of this key (->identifier). 4525dae460cSEric Biggers */ 45322d94f49SEric Biggers struct fscrypt_key_specifier mk_spec; 45422d94f49SEric Biggers 455b1c0ec35SEric Biggers /* 45623c688b5SEric Biggers * Keyring which contains a key of type 'key_type_fscrypt_user' for each 45723c688b5SEric Biggers * user who has added this key. Normally each key will be added by just 45823c688b5SEric Biggers * one user, but it's possible that multiple users share a key, and in 45923c688b5SEric Biggers * that case we need to keep track of those users so that one user can't 46023c688b5SEric Biggers * remove the key before the others want it removed too. 46123c688b5SEric Biggers * 46223c688b5SEric Biggers * This is NULL for v1 policy keys; those can only be added by root. 46323c688b5SEric Biggers * 46423c688b5SEric Biggers * Locking: in addition to this keyrings own semaphore, this is 46523c688b5SEric Biggers * protected by the master key's key->sem, so we can do atomic 46623c688b5SEric Biggers * search+insert. It can also be searched without taking any locks, but 46723c688b5SEric Biggers * in that case the returned key may have already been removed. 46823c688b5SEric Biggers */ 46923c688b5SEric Biggers struct key *mk_users; 47023c688b5SEric Biggers 47123c688b5SEric Biggers /* 472b1c0ec35SEric Biggers * Length of ->mk_decrypted_inodes, plus one if mk_secret is present. 473b1c0ec35SEric Biggers * Once this goes to 0, the master key is removed from ->s_master_keys. 474b1c0ec35SEric Biggers * The 'struct fscrypt_master_key' will continue to live as long as the 475b1c0ec35SEric Biggers * 'struct key' whose payload it is, but we won't let this reference 476b1c0ec35SEric Biggers * count rise again. 477b1c0ec35SEric Biggers */ 478b1c0ec35SEric Biggers refcount_t mk_refcount; 479b1c0ec35SEric Biggers 480b1c0ec35SEric Biggers /* 481b1c0ec35SEric Biggers * List of inodes that were unlocked using this key. This allows the 482b1c0ec35SEric Biggers * inodes to be evicted efficiently if the key is removed. 483b1c0ec35SEric Biggers */ 484b1c0ec35SEric Biggers struct list_head mk_decrypted_inodes; 485b1c0ec35SEric Biggers spinlock_t mk_decrypted_inodes_lock; 486b1c0ec35SEric Biggers 487b103fb76SEric Biggers /* 488e3b1078bSEric Biggers * Per-mode encryption keys for the various types of encryption policies 489e3b1078bSEric Biggers * that use them. Allocated and derived on-demand. 490b103fb76SEric Biggers */ 4915fee3609SSatya Tangirala struct fscrypt_prepared_key mk_direct_keys[__FSCRYPT_MODE_MAX + 1]; 4925fee3609SSatya Tangirala struct fscrypt_prepared_key mk_iv_ino_lblk_64_keys[__FSCRYPT_MODE_MAX + 1]; 4935fee3609SSatya Tangirala struct fscrypt_prepared_key mk_iv_ino_lblk_32_keys[__FSCRYPT_MODE_MAX + 1]; 494e3b1078bSEric Biggers 495e3b1078bSEric Biggers /* Hash key for inode numbers. Initialized only when needed. */ 496e3b1078bSEric Biggers siphash_key_t mk_ino_hash_key; 497e3b1078bSEric Biggers bool mk_ino_hash_key_initialized; 4985dae460cSEric Biggers 49922d94f49SEric Biggers } __randomize_layout; 50022d94f49SEric Biggers 501b1c0ec35SEric Biggers static inline bool 502b1c0ec35SEric Biggers is_master_key_secret_present(const struct fscrypt_master_key_secret *secret) 503b1c0ec35SEric Biggers { 504b1c0ec35SEric Biggers /* 505b1c0ec35SEric Biggers * The READ_ONCE() is only necessary for fscrypt_drop_inode() and 506b1c0ec35SEric Biggers * fscrypt_key_describe(). These run in atomic context, so they can't 50723c688b5SEric Biggers * take ->mk_secret_sem and thus 'secret' can change concurrently which 50823c688b5SEric Biggers * would be a data race. But they only need to know whether the secret 50923c688b5SEric Biggers * *was* present at the time of check, so READ_ONCE() suffices. 510b1c0ec35SEric Biggers */ 511b1c0ec35SEric Biggers return READ_ONCE(secret->size) != 0; 512b1c0ec35SEric Biggers } 513b1c0ec35SEric Biggers 51422d94f49SEric Biggers static inline const char *master_key_spec_type( 51522d94f49SEric Biggers const struct fscrypt_key_specifier *spec) 51622d94f49SEric Biggers { 51722d94f49SEric Biggers switch (spec->type) { 51822d94f49SEric Biggers case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR: 51922d94f49SEric Biggers return "descriptor"; 5205dae460cSEric Biggers case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER: 5215dae460cSEric Biggers return "identifier"; 52222d94f49SEric Biggers } 52322d94f49SEric Biggers return "[unknown]"; 52422d94f49SEric Biggers } 52522d94f49SEric Biggers 52622d94f49SEric Biggers static inline int master_key_spec_len(const struct fscrypt_key_specifier *spec) 52722d94f49SEric Biggers { 52822d94f49SEric Biggers switch (spec->type) { 52922d94f49SEric Biggers case FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR: 53022d94f49SEric Biggers return FSCRYPT_KEY_DESCRIPTOR_SIZE; 5315dae460cSEric Biggers case FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER: 5325dae460cSEric Biggers return FSCRYPT_KEY_IDENTIFIER_SIZE; 53322d94f49SEric Biggers } 53422d94f49SEric Biggers return 0; 53522d94f49SEric Biggers } 53622d94f49SEric Biggers 53760700902SEric Biggers struct key * 53822d94f49SEric Biggers fscrypt_find_master_key(struct super_block *sb, 53922d94f49SEric Biggers const struct fscrypt_key_specifier *mk_spec); 54022d94f49SEric Biggers 541cdeb21daSEric Biggers int fscrypt_add_test_dummy_key(struct super_block *sb, 542cdeb21daSEric Biggers struct fscrypt_key_specifier *key_spec); 543cdeb21daSEric Biggers 54460700902SEric Biggers int fscrypt_verify_key_added(struct super_block *sb, 5455ab7189aSEric Biggers const u8 identifier[FSCRYPT_KEY_IDENTIFIER_SIZE]); 5465ab7189aSEric Biggers 54760700902SEric Biggers int __init fscrypt_init_keyring(void); 54822d94f49SEric Biggers 549feed8258SEric Biggers /* keysetup.c */ 5508094c3ceSEric Biggers 5518094c3ceSEric Biggers struct fscrypt_mode { 5528094c3ceSEric Biggers const char *friendly_name; 5538094c3ceSEric Biggers const char *cipher_str; 5548094c3ceSEric Biggers int keysize; 5558094c3ceSEric Biggers int ivsize; 556ff73c2c0SEric Biggers int logged_impl_name; 5575fee3609SSatya Tangirala enum blk_crypto_mode_num blk_crypto_mode; 5588094c3ceSEric Biggers }; 5598094c3ceSEric Biggers 56085af90e5SEric Biggers extern struct fscrypt_mode fscrypt_modes[]; 5613ec4f2a6SEric Biggers 5625fee3609SSatya Tangirala int fscrypt_prepare_key(struct fscrypt_prepared_key *prep_key, 5635fee3609SSatya Tangirala const u8 *raw_key, const struct fscrypt_info *ci); 5645fee3609SSatya Tangirala 5655fee3609SSatya Tangirala void fscrypt_destroy_prepared_key(struct fscrypt_prepared_key *prep_key); 5660109ce76SEric Biggers 56760700902SEric Biggers int fscrypt_set_per_file_enc_key(struct fscrypt_info *ci, const u8 *raw_key); 5680109ce76SEric Biggers 56960700902SEric Biggers int fscrypt_derive_dirhash_key(struct fscrypt_info *ci, 570aa408f83SDaniel Rosenberg const struct fscrypt_master_key *mk); 571aa408f83SDaniel Rosenberg 5720109ce76SEric Biggers /* keysetup_v1.c */ 5730109ce76SEric Biggers 57460700902SEric Biggers void fscrypt_put_direct_key(struct fscrypt_direct_key *dk); 5750109ce76SEric Biggers 57660700902SEric Biggers int fscrypt_setup_v1_file_key(struct fscrypt_info *ci, 5770109ce76SEric Biggers const u8 *raw_master_key); 5780109ce76SEric Biggers 57960700902SEric Biggers int fscrypt_setup_v1_file_key_via_subscribed_keyrings(struct fscrypt_info *ci); 58060700902SEric Biggers 5815dae460cSEric Biggers /* policy.c */ 5825dae460cSEric Biggers 58360700902SEric Biggers bool fscrypt_policies_equal(const union fscrypt_policy *policy1, 5845dae460cSEric Biggers const union fscrypt_policy *policy2); 58560700902SEric Biggers bool fscrypt_supported_policy(const union fscrypt_policy *policy_u, 5865dae460cSEric Biggers const struct inode *inode); 58760700902SEric Biggers int fscrypt_policy_from_context(union fscrypt_policy *policy_u, 5885dae460cSEric Biggers const union fscrypt_context *ctx_u, 5895dae460cSEric Biggers int ctx_size); 5900109ce76SEric Biggers 5913325bea5STheodore Ts'o #endif /* _FSCRYPT_PRIVATE_H */ 592