]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/crypto/fscrypt_private.h
Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux.git] / fs / crypto / fscrypt_private.h
index 130b50e5a0115d9959e2cef9d606027fb48e79d5..9aae851409e55ffecedb9d9b2a7ac656acd25439 100644 (file)
@@ -12,6 +12,7 @@
 #define _FSCRYPT_PRIVATE_H
 
 #include <linux/fscrypt.h>
+#include <linux/siphash.h>
 #include <crypto/hash.h>
 
 #define CONST_STRLEN(str)      (sizeof(str) - 1)
@@ -136,12 +137,6 @@ fscrypt_policy_flags(const union fscrypt_policy *policy)
        BUG();
 }
 
-static inline bool
-fscrypt_is_direct_key_policy(const union fscrypt_policy *policy)
-{
-       return fscrypt_policy_flags(policy) & FSCRYPT_POLICY_FLAG_DIRECT_KEY;
-}
-
 /**
  * For encrypted symlinks, the ciphertext length is stored at the beginning
  * of the string in little-endian format.
@@ -194,6 +189,14 @@ struct fscrypt_info {
         */
        struct fscrypt_direct_key *ci_direct_key;
 
+       /*
+        * This inode's hash key for filenames.  This is a 128-bit SipHash-2-4
+        * key.  This is only set for directories that use a keyed dirhash over
+        * the plaintext filenames -- currently just casefolded directories.
+        */
+       siphash_key_t ci_dirhash_key;
+       bool ci_dirhash_key_initialized;
+
        /* The encryption policy used by this inode */
        union fscrypt_policy ci_policy;
 
@@ -206,24 +209,6 @@ typedef enum {
        FS_ENCRYPT,
 } fscrypt_direction_t;
 
-static inline bool fscrypt_valid_enc_modes(u32 contents_mode,
-                                          u32 filenames_mode)
-{
-       if (contents_mode == FSCRYPT_MODE_AES_128_CBC &&
-           filenames_mode == FSCRYPT_MODE_AES_128_CTS)
-               return true;
-
-       if (contents_mode == FSCRYPT_MODE_AES_256_XTS &&
-           filenames_mode == FSCRYPT_MODE_AES_256_CTS)
-               return true;
-
-       if (contents_mode == FSCRYPT_MODE_ADIANTUM &&
-           filenames_mode == FSCRYPT_MODE_ADIANTUM)
-               return true;
-
-       return false;
-}
-
 /* crypto.c */
 extern struct kmem_cache *fscrypt_info_cachep;
 extern int fscrypt_initialize(unsigned int cop_flags);
@@ -233,7 +218,6 @@ extern int fscrypt_crypt_block(const struct inode *inode,
                               unsigned int len, unsigned int offs,
                               gfp_t gfp_flags);
 extern struct page *fscrypt_alloc_bounce_page(gfp_t gfp_flags);
-extern const struct dentry_operations fscrypt_d_ops;
 
 extern void __printf(3, 4) __cold
 fscrypt_msg(const struct inode *inode, const char *level, const char *fmt, ...);
@@ -260,11 +244,13 @@ void fscrypt_generate_iv(union fscrypt_iv *iv, u64 lblk_num,
                         const struct fscrypt_info *ci);
 
 /* fname.c */
-extern int fname_encrypt(struct inode *inode, const struct qstr *iname,
-                        u8 *out, unsigned int olen);
+extern int fscrypt_fname_encrypt(const 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);
+extern const struct dentry_operations fscrypt_d_ops;
 
 /* hkdf.c */
 
@@ -283,11 +269,12 @@ extern int fscrypt_init_hkdf(struct fscrypt_hkdf *hkdf, const u8 *master_key,
  * output doesn't reveal another.
  */
 #define HKDF_CONTEXT_KEY_IDENTIFIER    1
-#define HKDF_CONTEXT_PER_FILE_KEY      2
+#define HKDF_CONTEXT_PER_FILE_ENC_KEY  2
 #define HKDF_CONTEXT_DIRECT_KEY                3
 #define HKDF_CONTEXT_IV_INO_LBLK_64_KEY        4
+#define HKDF_CONTEXT_DIRHASH_KEY       5
 
-extern int fscrypt_hkdf_expand(struct fscrypt_hkdf *hkdf, u8 context,
+extern int fscrypt_hkdf_expand(const struct fscrypt_hkdf *hkdf, u8 context,
                               const u8 *info, unsigned int infolen,
                               u8 *okm, unsigned int okmlen);
 
@@ -448,18 +435,17 @@ struct fscrypt_mode {
        int logged_impl_name;
 };
 
-static inline bool
-fscrypt_mode_supports_direct_key(const struct fscrypt_mode *mode)
-{
-       return mode->ivsize >= offsetofend(union fscrypt_iv, nonce);
-}
+extern struct fscrypt_mode fscrypt_modes[];
 
 extern struct crypto_skcipher *
 fscrypt_allocate_skcipher(struct fscrypt_mode *mode, const u8 *raw_key,
                          const struct inode *inode);
 
-extern int fscrypt_set_derived_key(struct fscrypt_info *ci,
-                                  const u8 *derived_key);
+extern int fscrypt_set_per_file_enc_key(struct fscrypt_info *ci,
+                                       const u8 *raw_key);
+
+extern int fscrypt_derive_dirhash_key(struct fscrypt_info *ci,
+                                     const struct fscrypt_master_key *mk);
 
 /* keysetup_v1.c */