Merge tag 'pwm/for-4.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thierry...
[sfrench/cifs-2.6.git] / fs / crypto / fscrypt_private.h
index c0b4f5597e1a3ee772d1c6ecba8f3b73033b74ba..ad6722bae8b7499b8128224cef436898043afc3d 100644 (file)
@@ -50,6 +50,15 @@ struct fscrypt_context {
 
 #define FS_ENCRYPTION_CONTEXT_FORMAT_V1                1
 
+/**
+ * For encrypted symlinks, the ciphertext length is stored at the beginning
+ * of the string in little-endian format.
+ */
+struct fscrypt_symlink_data {
+       __le16 len;
+       char encrypted_path[1];
+} __packed;
+
 /*
  * A pointer to this structure is stored in the file system's in-core
  * representation of an inode.
@@ -71,7 +80,22 @@ typedef enum {
 #define FS_CTX_REQUIRES_FREE_ENCRYPT_FL                0x00000001
 #define FS_CTX_HAS_BOUNCE_BUFFER_FL            0x00000002
 
+static inline bool fscrypt_valid_enc_modes(u32 contents_mode,
+                                          u32 filenames_mode)
+{
+       if (contents_mode == FS_ENCRYPTION_MODE_AES_128_CBC &&
+           filenames_mode == FS_ENCRYPTION_MODE_AES_128_CTS)
+               return true;
+
+       if (contents_mode == FS_ENCRYPTION_MODE_AES_256_XTS &&
+           filenames_mode == FS_ENCRYPTION_MODE_AES_256_CTS)
+               return true;
+
+       return false;
+}
+
 /* crypto.c */
+extern struct kmem_cache *fscrypt_info_cachep;
 extern int fscrypt_initialize(unsigned int cop_flags);
 extern struct workqueue_struct *fscrypt_read_workqueue;
 extern int fscrypt_do_page_crypto(const struct inode *inode,
@@ -83,6 +107,13 @@ extern int fscrypt_do_page_crypto(const struct inode *inode,
 extern struct page *fscrypt_alloc_bounce_page(struct fscrypt_ctx *ctx,
                                              gfp_t gfp_flags);
 
+/* fname.c */
+extern int fname_encrypt(struct inode *inode, const struct qstr *iname,
+                        u8 *out, unsigned int olen);
+extern bool fscrypt_fname_encrypted_size(const struct inode *inode,
+                                        u32 orig_len, u32 max_len,
+                                        u32 *encrypted_len_ret);
+
 /* keyinfo.c */
 extern void __exit fscrypt_essiv_cleanup(void);