Whamcloud - gitweb
LU-12275 sec: add llcrypt as file encryption library
[fs/lustre-release.git] / libcfs / libcfs / crypto / fname.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * This contains functions for filename crypto management
4  *
5  * Copyright (C) 2015, Google, Inc.
6  * Copyright (C) 2015, Motorola Mobility
7  *
8  * Written by Uday Savagaonkar, 2014.
9  * Modified by Jaegeuk Kim, 2015.
10  *
11  * This has not yet undergone a rigorous security audit.
12  */
13 /*
14  * Linux commit 219d54332a09
15  * tags/v5.4
16  */
17
18 #include <linux/scatterlist.h>
19 #include <crypto/skcipher.h>
20 #include "llcrypt_private.h"
21
22 static inline bool llcrypt_is_dot_dotdot(const struct qstr *str)
23 {
24         if (str->len == 1 && str->name[0] == '.')
25                 return true;
26
27         if (str->len == 2 && str->name[0] == '.' && str->name[1] == '.')
28                 return true;
29
30         return false;
31 }
32
33 /**
34  * fname_encrypt() - encrypt a filename
35  *
36  * The output buffer must be at least as large as the input buffer.
37  * Any extra space is filled with NUL padding before encryption.
38  *
39  * Return: 0 on success, -errno on failure
40  */
41 int fname_encrypt(struct inode *inode, const struct qstr *iname,
42                   u8 *out, unsigned int olen)
43 {
44         struct skcipher_request *req = NULL;
45         DECLARE_CRYPTO_WAIT(wait);
46         struct llcrypt_info *ci = llcrypt_info(inode);
47         struct crypto_skcipher *tfm = ci->ci_ctfm;
48         union llcrypt_iv iv;
49         struct scatterlist sg;
50         int res;
51
52         /*
53          * Copy the filename to the output buffer for encrypting in-place and
54          * pad it with the needed number of NUL bytes.
55          */
56         if (WARN_ON(olen < iname->len))
57                 return -ENOBUFS;
58         memcpy(out, iname->name, iname->len);
59         memset(out + iname->len, 0, olen - iname->len);
60
61         /* Initialize the IV */
62         llcrypt_generate_iv(&iv, 0, ci);
63
64         /* Set up the encryption request */
65         req = skcipher_request_alloc(tfm, GFP_NOFS);
66         if (!req)
67                 return -ENOMEM;
68         skcipher_request_set_callback(req,
69                         CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
70                         crypto_req_done, &wait);
71         sg_init_one(&sg, out, olen);
72         skcipher_request_set_crypt(req, &sg, &sg, olen, &iv);
73
74         /* Do the encryption */
75         res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
76         skcipher_request_free(req);
77         if (res < 0) {
78                 llcrypt_err(inode, "Filename encryption failed: %d", res);
79                 return res;
80         }
81
82         return 0;
83 }
84
85 /**
86  * fname_decrypt() - decrypt a filename
87  *
88  * The caller must have allocated sufficient memory for the @oname string.
89  *
90  * Return: 0 on success, -errno on failure
91  */
92 static int fname_decrypt(struct inode *inode,
93                                 const struct llcrypt_str *iname,
94                                 struct llcrypt_str *oname)
95 {
96         struct skcipher_request *req = NULL;
97         DECLARE_CRYPTO_WAIT(wait);
98         struct scatterlist src_sg, dst_sg;
99         struct llcrypt_info *ci = llcrypt_info(inode);
100         struct crypto_skcipher *tfm = ci->ci_ctfm;
101         union llcrypt_iv iv;
102         int res;
103
104         /* Allocate request */
105         req = skcipher_request_alloc(tfm, GFP_NOFS);
106         if (!req)
107                 return -ENOMEM;
108         skcipher_request_set_callback(req,
109                 CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
110                 crypto_req_done, &wait);
111
112         /* Initialize IV */
113         llcrypt_generate_iv(&iv, 0, ci);
114
115         /* Create decryption request */
116         sg_init_one(&src_sg, iname->name, iname->len);
117         sg_init_one(&dst_sg, oname->name, oname->len);
118         skcipher_request_set_crypt(req, &src_sg, &dst_sg, iname->len, &iv);
119         res = crypto_wait_req(crypto_skcipher_decrypt(req), &wait);
120         skcipher_request_free(req);
121         if (res < 0) {
122                 llcrypt_err(inode, "Filename decryption failed: %d", res);
123                 return res;
124         }
125
126         oname->len = strnlen(oname->name, iname->len);
127         return 0;
128 }
129
130 static const char lookup_table[65] =
131         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,";
132
133 #define BASE64_CHARS(nbytes)    DIV_ROUND_UP((nbytes) * 4, 3)
134
135 /**
136  * base64_encode() -
137  *
138  * Encodes the input string using characters from the set [A-Za-z0-9+,].
139  * The encoded string is roughly 4/3 times the size of the input string.
140  *
141  * Return: length of the encoded string
142  */
143 static int base64_encode(const u8 *src, int len, char *dst)
144 {
145         int i, bits = 0, ac = 0;
146         char *cp = dst;
147
148         for (i = 0; i < len; i++) {
149                 ac += src[i] << bits;
150                 bits += 8;
151                 do {
152                         *cp++ = lookup_table[ac & 0x3f];
153                         ac >>= 6;
154                         bits -= 6;
155                 } while (bits >= 6);
156         }
157         if (bits)
158                 *cp++ = lookup_table[ac & 0x3f];
159         return cp - dst;
160 }
161
162 static int base64_decode(const char *src, int len, u8 *dst)
163 {
164         int i, bits = 0, ac = 0;
165         const char *p;
166         u8 *cp = dst;
167
168         for (i = 0; i < len; i++) {
169                 p = strchr(lookup_table, src[i]);
170                 if (p == NULL || src[i] == 0)
171                         return -2;
172                 ac += (p - lookup_table) << bits;
173                 bits += 6;
174                 if (bits >= 8) {
175                         *cp++ = ac & 0xff;
176                         ac >>= 8;
177                         bits -= 8;
178                 }
179         }
180         if (ac)
181                 return -1;
182         return cp - dst;
183 }
184
185 bool llcrypt_fname_encrypted_size(const struct inode *inode, u32 orig_len,
186                                   u32 max_len, u32 *encrypted_len_ret)
187 {
188         const struct llcrypt_info *ci = llcrypt_info(inode);
189         int padding = 4 << (llcrypt_policy_flags(&ci->ci_policy) &
190                             LLCRYPT_POLICY_FLAGS_PAD_MASK);
191         u32 encrypted_len;
192
193         if (orig_len > max_len)
194                 return false;
195         encrypted_len = max(orig_len, (u32)LL_CRYPTO_BLOCK_SIZE);
196         encrypted_len = round_up(encrypted_len, padding);
197         *encrypted_len_ret = min(encrypted_len, max_len);
198         return true;
199 }
200
201 /**
202  * llcrypt_fname_alloc_buffer - allocate a buffer for presented filenames
203  *
204  * Allocate a buffer that is large enough to hold any decrypted or encoded
205  * filename (null-terminated), for the given maximum encrypted filename length.
206  *
207  * Return: 0 on success, -errno on failure
208  */
209 int llcrypt_fname_alloc_buffer(const struct inode *inode,
210                                u32 max_encrypted_len,
211                                struct llcrypt_str *crypto_str)
212 {
213         const u32 max_encoded_len =
214                 max_t(u32, BASE64_CHARS(LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE),
215                       1 + BASE64_CHARS(sizeof(struct llcrypt_digested_name)));
216         u32 max_presented_len;
217
218         max_presented_len = max(max_encoded_len, max_encrypted_len);
219
220         crypto_str->name = kmalloc(max_presented_len + 1, GFP_NOFS);
221         if (!crypto_str->name)
222                 return -ENOMEM;
223         crypto_str->len = max_presented_len;
224         return 0;
225 }
226 EXPORT_SYMBOL(llcrypt_fname_alloc_buffer);
227
228 /**
229  * llcrypt_fname_free_buffer - free the buffer for presented filenames
230  *
231  * Free the buffer allocated by llcrypt_fname_alloc_buffer().
232  */
233 void llcrypt_fname_free_buffer(struct llcrypt_str *crypto_str)
234 {
235         if (!crypto_str)
236                 return;
237         kfree(crypto_str->name);
238         crypto_str->name = NULL;
239 }
240 EXPORT_SYMBOL(llcrypt_fname_free_buffer);
241
242 /**
243  * llcrypt_fname_disk_to_usr() - converts a filename from disk space to user
244  * space
245  *
246  * The caller must have allocated sufficient memory for the @oname string.
247  *
248  * If the key is available, we'll decrypt the disk name; otherwise, we'll encode
249  * it for presentation.  Short names are directly base64-encoded, while long
250  * names are encoded in llcrypt_digested_name format.
251  *
252  * Return: 0 on success, -errno on failure
253  */
254 int llcrypt_fname_disk_to_usr(struct inode *inode,
255                         u32 hash, u32 minor_hash,
256                         const struct llcrypt_str *iname,
257                         struct llcrypt_str *oname)
258 {
259         const struct qstr qname = LLTR_TO_QSTR(iname);
260         struct llcrypt_digested_name digested_name;
261
262         if (llcrypt_is_dot_dotdot(&qname)) {
263                 oname->name[0] = '.';
264                 oname->name[iname->len - 1] = '.';
265                 oname->len = iname->len;
266                 return 0;
267         }
268
269         if (iname->len < LL_CRYPTO_BLOCK_SIZE)
270                 return -EUCLEAN;
271
272         if (llcrypt_has_encryption_key(inode))
273                 return fname_decrypt(inode, iname, oname);
274
275         if (iname->len <= LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE) {
276                 oname->len = base64_encode(iname->name, iname->len,
277                                            oname->name);
278                 return 0;
279         }
280         if (hash) {
281                 digested_name.hash = hash;
282                 digested_name.minor_hash = minor_hash;
283         } else {
284                 digested_name.hash = 0;
285                 digested_name.minor_hash = 0;
286         }
287         memcpy(digested_name.digest,
288                LLCRYPT_FNAME_DIGEST(iname->name, iname->len),
289                LLCRYPT_FNAME_DIGEST_SIZE);
290         oname->name[0] = '_';
291         oname->len = 1 + base64_encode((const u8 *)&digested_name,
292                                        sizeof(digested_name), oname->name + 1);
293         return 0;
294 }
295 EXPORT_SYMBOL(llcrypt_fname_disk_to_usr);
296
297 /**
298  * llcrypt_setup_filename() - prepare to search a possibly encrypted directory
299  * @dir: the directory that will be searched
300  * @iname: the user-provided filename being searched for
301  * @lookup: 1 if we're allowed to proceed without the key because it's
302  *      ->lookup() or we're finding the dir_entry for deletion; 0 if we cannot
303  *      proceed without the key because we're going to create the dir_entry.
304  * @fname: the filename information to be filled in
305  *
306  * Given a user-provided filename @iname, this function sets @fname->disk_name
307  * to the name that would be stored in the on-disk directory entry, if possible.
308  * If the directory is unencrypted this is simply @iname.  Else, if we have the
309  * directory's encryption key, then @iname is the plaintext, so we encrypt it to
310  * get the disk_name.
311  *
312  * Else, for keyless @lookup operations, @iname is the presented ciphertext, so
313  * we decode it to get either the ciphertext disk_name (for short names) or the
314  * llcrypt_digested_name (for long names).  Non-@lookup operations will be
315  * impossible in this case, so we fail them with ENOKEY.
316  *
317  * If successful, llcrypt_free_filename() must be called later to clean up.
318  *
319  * Return: 0 on success, -errno on failure
320  */
321 int llcrypt_setup_filename(struct inode *dir, const struct qstr *iname,
322                               int lookup, struct llcrypt_name *fname)
323 {
324         int ret;
325         int digested;
326
327         memset(fname, 0, sizeof(struct llcrypt_name));
328         fname->usr_fname = iname;
329
330         if (!IS_ENCRYPTED(dir) || llcrypt_is_dot_dotdot(iname)) {
331                 fname->disk_name.name = (unsigned char *)iname->name;
332                 fname->disk_name.len = iname->len;
333                 return 0;
334         }
335         ret = llcrypt_get_encryption_info(dir);
336         if (ret)
337                 return ret;
338
339         if (llcrypt_has_encryption_key(dir)) {
340                 struct lustre_sb_info *lsi = s2lsi(dir->i_sb);
341
342                 if (!llcrypt_fname_encrypted_size(dir, iname->len,
343                                                   lsi ?
344                                                     lsi->lsi_cop->max_namelen :
345                                                     NAME_MAX,
346                                                   &fname->crypto_buf.len))
347                         return -ENAMETOOLONG;
348                 fname->crypto_buf.name = kmalloc(fname->crypto_buf.len,
349                                                  GFP_NOFS);
350                 if (!fname->crypto_buf.name)
351                         return -ENOMEM;
352
353                 ret = fname_encrypt(dir, iname, fname->crypto_buf.name,
354                                     fname->crypto_buf.len);
355                 if (ret)
356                         goto errout;
357                 fname->disk_name.name = fname->crypto_buf.name;
358                 fname->disk_name.len = fname->crypto_buf.len;
359                 return 0;
360         }
361         if (!lookup)
362                 return -ENOKEY;
363         fname->is_ciphertext_name = true;
364
365         /*
366          * We don't have the key and we are doing a lookup; decode the
367          * user-supplied name
368          */
369         if (iname->name[0] == '_') {
370                 if (iname->len !=
371                     1 + BASE64_CHARS(sizeof(struct llcrypt_digested_name)))
372                         return -ENOENT;
373                 digested = 1;
374         } else {
375                 if (iname->len >
376                     BASE64_CHARS(LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE))
377                         return -ENOENT;
378                 digested = 0;
379         }
380
381         fname->crypto_buf.name =
382                 kmalloc(max_t(size_t, LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE,
383                               sizeof(struct llcrypt_digested_name)),
384                         GFP_KERNEL);
385         if (fname->crypto_buf.name == NULL)
386                 return -ENOMEM;
387
388         ret = base64_decode(iname->name + digested, iname->len - digested,
389                             fname->crypto_buf.name);
390         if (ret < 0) {
391                 ret = -ENOENT;
392                 goto errout;
393         }
394         fname->crypto_buf.len = ret;
395         if (digested) {
396                 const struct llcrypt_digested_name *n =
397                         (const void *)fname->crypto_buf.name;
398                 fname->hash = n->hash;
399                 fname->minor_hash = n->minor_hash;
400         } else {
401                 fname->disk_name.name = fname->crypto_buf.name;
402                 fname->disk_name.len = fname->crypto_buf.len;
403         }
404         return 0;
405
406 errout:
407         kfree(fname->crypto_buf.name);
408         return ret;
409 }
410 EXPORT_SYMBOL(llcrypt_setup_filename);