]>
Commit | Line | Data |
---|---|---|
46f47e48 EB |
1 | /* |
2 | * fscrypt_common.h: common declarations for per-file encryption | |
3 | * | |
4 | * Copyright (C) 2015, Google, Inc. | |
5 | * | |
6 | * Written by Michael Halcrow, 2015. | |
7 | * Modified by Jaegeuk Kim, 2015. | |
8 | */ | |
9 | ||
10 | #ifndef _LINUX_FSCRYPT_COMMON_H | |
11 | #define _LINUX_FSCRYPT_COMMON_H | |
12 | ||
13 | #include <linux/key.h> | |
14 | #include <linux/fs.h> | |
15 | #include <linux/mm.h> | |
16 | #include <linux/bio.h> | |
17 | #include <linux/dcache.h> | |
18 | #include <crypto/skcipher.h> | |
19 | #include <uapi/linux/fs.h> | |
20 | ||
21 | #define FS_CRYPTO_BLOCK_SIZE 16 | |
22 | ||
23 | struct fscrypt_info; | |
24 | ||
25 | struct fscrypt_ctx { | |
26 | union { | |
27 | struct { | |
28 | struct page *bounce_page; /* Ciphertext page */ | |
29 | struct page *control_page; /* Original page */ | |
30 | } w; | |
31 | struct { | |
32 | struct bio *bio; | |
33 | struct work_struct work; | |
34 | } r; | |
35 | struct list_head free_list; /* Free list */ | |
36 | }; | |
37 | u8 flags; /* Flags */ | |
38 | }; | |
39 | ||
40 | /** | |
41 | * For encrypted symlinks, the ciphertext length is stored at the beginning | |
42 | * of the string in little-endian format. | |
43 | */ | |
44 | struct fscrypt_symlink_data { | |
45 | __le16 len; | |
46 | char encrypted_path[1]; | |
47 | } __packed; | |
48 | ||
49 | /** | |
50 | * This function is used to calculate the disk space required to | |
51 | * store a filename of length l in encrypted symlink format. | |
52 | */ | |
53 | static inline u32 fscrypt_symlink_data_len(u32 l) | |
54 | { | |
55 | if (l < FS_CRYPTO_BLOCK_SIZE) | |
56 | l = FS_CRYPTO_BLOCK_SIZE; | |
57 | return (l + sizeof(struct fscrypt_symlink_data) - 1); | |
58 | } | |
59 | ||
60 | struct fscrypt_str { | |
61 | unsigned char *name; | |
62 | u32 len; | |
63 | }; | |
64 | ||
65 | struct fscrypt_name { | |
66 | const struct qstr *usr_fname; | |
67 | struct fscrypt_str disk_name; | |
68 | u32 hash; | |
69 | u32 minor_hash; | |
70 | struct fscrypt_str crypto_buf; | |
71 | }; | |
72 | ||
73 | #define FSTR_INIT(n, l) { .name = n, .len = l } | |
74 | #define FSTR_TO_QSTR(f) QSTR_INIT((f)->name, (f)->len) | |
75 | #define fname_name(p) ((p)->disk_name.name) | |
76 | #define fname_len(p) ((p)->disk_name.len) | |
77 | ||
78 | /* | |
79 | * fscrypt superblock flags | |
80 | */ | |
81 | #define FS_CFLG_OWN_PAGES (1U << 1) | |
82 | ||
83 | /* | |
84 | * crypto opertions for filesystems | |
85 | */ | |
86 | struct fscrypt_operations { | |
87 | unsigned int flags; | |
88 | const char *key_prefix; | |
89 | int (*get_context)(struct inode *, void *, size_t); | |
90 | int (*prepare_context)(struct inode *); | |
91 | int (*set_context)(struct inode *, const void *, size_t, void *); | |
92 | int (*dummy_context)(struct inode *); | |
93 | bool (*is_encrypted)(struct inode *); | |
94 | bool (*empty_dir)(struct inode *); | |
95 | unsigned (*max_namelen)(struct inode *); | |
96 | }; | |
97 | ||
98 | static inline bool fscrypt_dummy_context_enabled(struct inode *inode) | |
99 | { | |
100 | if (inode->i_sb->s_cop->dummy_context && | |
101 | inode->i_sb->s_cop->dummy_context(inode)) | |
102 | return true; | |
103 | return false; | |
104 | } | |
105 | ||
106 | static inline bool fscrypt_valid_contents_enc_mode(u32 mode) | |
107 | { | |
108 | return (mode == FS_ENCRYPTION_MODE_AES_256_XTS); | |
109 | } | |
110 | ||
111 | static inline bool fscrypt_valid_filenames_enc_mode(u32 mode) | |
112 | { | |
113 | return (mode == FS_ENCRYPTION_MODE_AES_256_CTS); | |
114 | } | |
115 | ||
116 | static inline bool fscrypt_is_dot_dotdot(const struct qstr *str) | |
117 | { | |
118 | if (str->len == 1 && str->name[0] == '.') | |
119 | return true; | |
120 | ||
121 | if (str->len == 2 && str->name[0] == '.' && str->name[1] == '.') | |
122 | return true; | |
123 | ||
124 | return false; | |
125 | } | |
126 | ||
127 | static inline struct page *fscrypt_control_page(struct page *page) | |
128 | { | |
129 | #if IS_ENABLED(CONFIG_FS_ENCRYPTION) | |
130 | return ((struct fscrypt_ctx *)page_private(page))->w.control_page; | |
131 | #else | |
132 | WARN_ON_ONCE(1); | |
133 | return ERR_PTR(-EINVAL); | |
134 | #endif | |
135 | } | |
136 | ||
137 | static inline int fscrypt_has_encryption_key(const struct inode *inode) | |
138 | { | |
139 | #if IS_ENABLED(CONFIG_FS_ENCRYPTION) | |
140 | return (inode->i_crypt_info != NULL); | |
141 | #else | |
142 | return 0; | |
143 | #endif | |
144 | } | |
145 | ||
146 | #endif /* _LINUX_FSCRYPT_COMMON_H */ |