1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * fscrypt_private.h 4 * 5 * Copyright (C) 2015, Google, Inc. 6 * 7 * This contains encryption key functions. 8 * 9 * Written by Michael Halcrow, Ildar Muslukhov, and Uday Savagaonkar, 2015. 10 */ 11 12 #ifndef _FSCRYPT_PRIVATE_H 13 #define _FSCRYPT_PRIVATE_H 14 15 #include <linux/fscrypt_supp.h> 16 #include <crypto/hash.h> 17 18 /* Encryption parameters */ 19 #define FS_IV_SIZE 16 20 #define FS_AES_128_ECB_KEY_SIZE 16 21 #define FS_AES_128_CBC_KEY_SIZE 16 22 #define FS_AES_128_CTS_KEY_SIZE 16 23 #define FS_AES_256_GCM_KEY_SIZE 32 24 #define FS_AES_256_CBC_KEY_SIZE 32 25 #define FS_AES_256_CTS_KEY_SIZE 32 26 #define FS_AES_256_XTS_KEY_SIZE 64 27 28 #define FS_KEY_DERIVATION_NONCE_SIZE 16 29 30 /** 31 * Encryption context for inode 32 * 33 * Protector format: 34 * 1 byte: Protector format (1 = this version) 35 * 1 byte: File contents encryption mode 36 * 1 byte: File names encryption mode 37 * 1 byte: Flags 38 * 8 bytes: Master Key descriptor 39 * 16 bytes: Encryption Key derivation nonce 40 */ 41 struct fscrypt_context { 42 u8 format; 43 u8 contents_encryption_mode; 44 u8 filenames_encryption_mode; 45 u8 flags; 46 u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE]; 47 u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE]; 48 } __packed; 49 50 #define FS_ENCRYPTION_CONTEXT_FORMAT_V1 1 51 52 /* 53 * A pointer to this structure is stored in the file system's in-core 54 * representation of an inode. 55 */ 56 struct fscrypt_info { 57 u8 ci_data_mode; 58 u8 ci_filename_mode; 59 u8 ci_flags; 60 struct crypto_skcipher *ci_ctfm; 61 struct crypto_cipher *ci_essiv_tfm; 62 u8 ci_master_key[FS_KEY_DESCRIPTOR_SIZE]; 63 }; 64 65 typedef enum { 66 FS_DECRYPT = 0, 67 FS_ENCRYPT, 68 } fscrypt_direction_t; 69 70 #define FS_CTX_REQUIRES_FREE_ENCRYPT_FL 0x00000001 71 #define FS_CTX_HAS_BOUNCE_BUFFER_FL 0x00000002 72 73 struct fscrypt_completion_result { 74 struct completion completion; 75 int res; 76 }; 77 78 #define DECLARE_FS_COMPLETION_RESULT(ecr) \ 79 struct fscrypt_completion_result ecr = { \ 80 COMPLETION_INITIALIZER_ONSTACK((ecr).completion), 0 } 81 82 83 /* crypto.c */ 84 extern int fscrypt_initialize(unsigned int cop_flags); 85 extern struct workqueue_struct *fscrypt_read_workqueue; 86 extern int fscrypt_do_page_crypto(const struct inode *inode, 87 fscrypt_direction_t rw, u64 lblk_num, 88 struct page *src_page, 89 struct page *dest_page, 90 unsigned int len, unsigned int offs, 91 gfp_t gfp_flags); 92 extern struct page *fscrypt_alloc_bounce_page(struct fscrypt_ctx *ctx, 93 gfp_t gfp_flags); 94 95 /* keyinfo.c */ 96 extern void __exit fscrypt_essiv_cleanup(void); 97 98 #endif /* _FSCRYPT_PRIVATE_H */ 99