Whamcloud - gitweb
LU-17914 lnet: Fix erroneous net set error
[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         if (tfm == NULL)
62                 return 0;
63
64         /* Initialize the IV */
65         llcrypt_generate_iv(&iv, 0, ci);
66
67         /* Set up the encryption request */
68         req = skcipher_request_alloc(tfm, GFP_NOFS);
69         if (!req)
70                 return -ENOMEM;
71         skcipher_request_set_callback(req,
72                         CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
73                         crypto_req_done, &wait);
74         sg_init_one(&sg, out, olen);
75         skcipher_request_set_crypt(req, &sg, &sg, olen, &iv);
76
77         /* Do the encryption */
78         res = crypto_wait_req(crypto_skcipher_encrypt(req), &wait);
79         skcipher_request_free(req);
80         if (res < 0) {
81                 llcrypt_err(inode, "Filename encryption failed: %d", res);
82                 return res;
83         }
84
85         return 0;
86 }
87
88 /**
89  * fname_decrypt() - decrypt a filename
90  *
91  * The caller must have allocated sufficient memory for the @oname string.
92  *
93  * Return: 0 on success, -errno on failure
94  */
95 static int fname_decrypt(struct inode *inode,
96                                 const struct llcrypt_str *iname,
97                                 struct llcrypt_str *oname)
98 {
99         struct skcipher_request *req = NULL;
100         DECLARE_CRYPTO_WAIT(wait);
101         struct scatterlist src_sg, dst_sg;
102         struct llcrypt_info *ci = llcrypt_info(inode);
103         struct crypto_skcipher *tfm = ci->ci_ctfm;
104         union llcrypt_iv iv;
105         int res;
106
107         if (tfm == NULL) {
108                 memcpy(oname->name, iname->name, iname->len);
109                 oname->name[iname->len] = '\0';
110                 oname->len = iname->len;
111                 return 0;
112         }
113
114         /* Allocate request */
115         req = skcipher_request_alloc(tfm, GFP_NOFS);
116         if (!req)
117                 return -ENOMEM;
118         skcipher_request_set_callback(req,
119                 CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
120                 crypto_req_done, &wait);
121
122         /* Initialize IV */
123         llcrypt_generate_iv(&iv, 0, ci);
124
125         /* Create decryption request */
126         sg_init_one(&src_sg, iname->name, iname->len);
127         sg_init_one(&dst_sg, oname->name, oname->len);
128         skcipher_request_set_crypt(req, &src_sg, &dst_sg, iname->len, &iv);
129         res = crypto_wait_req(crypto_skcipher_decrypt(req), &wait);
130         skcipher_request_free(req);
131         if (res < 0) {
132                 llcrypt_err(inode, "Filename decryption failed: %d", res);
133                 return res;
134         }
135
136         oname->len = strnlen(oname->name, iname->len);
137         return 0;
138 }
139
140 /*
141  * Old fashion base64 encoding, taken from Linux 5.4.
142  *
143  * This base64 encoding is specific to fscrypt and has been replaced since then
144  * with an RFC 4648 compliant base64-url encoding, see llcrypt_base64url_*
145  * below.
146  * The old fashion base64 encoding is kept for compatibility with older clients.
147  */
148
149 static const char lookup_table[65] =
150         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,";
151
152 #define LLCRYPT_BASE64_CHARS(nbytes)    DIV_ROUND_UP((nbytes) * 4, 3)
153
154 /**
155  * base64_encode() -
156  *
157  * Encodes the input string using characters from the set [A-Za-z0-9+,].
158  * The encoded string is roughly 4/3 times the size of the input string.
159  *
160  * Return: length of the encoded string
161  */
162 static inline int llcrypt_base64_encode(const u8 *src, int len, char *dst)
163 {
164         int i, bits = 0, ac = 0;
165         char *cp = dst;
166
167         for (i = 0; i < len; i++) {
168                 ac += src[i] << bits;
169                 bits += 8;
170                 do {
171                         *cp++ = lookup_table[ac & 0x3f];
172                         ac >>= 6;
173                         bits -= 6;
174                 } while (bits >= 6);
175         }
176         if (bits)
177                 *cp++ = lookup_table[ac & 0x3f];
178         return cp - dst;
179 }
180
181 static inline int llcrypt_base64_decode(const char *src, int len, u8 *dst)
182 {
183         int i, bits = 0, ac = 0;
184         const char *p;
185         u8 *cp = dst;
186
187         for (i = 0; i < len; i++) {
188                 p = strchr(lookup_table, src[i]);
189                 if (p == NULL || src[i] == 0)
190                         return -2;
191                 ac += (p - lookup_table) << bits;
192                 bits += 6;
193                 if (bits >= 8) {
194                         *cp++ = ac & 0xff;
195                         ac >>= 8;
196                         bits -= 8;
197                 }
198         }
199         if (ac)
200                 return -1;
201         return cp - dst;
202 }
203
204 /*
205  * New fashion base64 encoding, taken from Linux 5.14.
206  *
207  * This base64 encoding is RFC 4648 compliant base64-url encoding.
208  */
209
210 #define LLCRYPT_BASE64URL_CHARS(nbytes) DIV_ROUND_UP((nbytes) * 4, 3)
211
212 /**
213  * llcrypt_base64url_encode() - base64url-encode some binary data
214  * @src: the binary data to encode
215  * @srclen: the length of @src in bytes
216  * @dst: (output) the base64url-encoded string.  Not NUL-terminated.
217  *
218  * Encodes data using base64url encoding, i.e. the "Base 64 Encoding with URL
219  * and Filename Safe Alphabet" specified by RFC 4648.  '='-padding isn't used,
220  * as it's unneeded and not required by the RFC.  base64url is used instead of
221  * base64 to avoid the '/' character, which isn't allowed in filenames.
222  *
223  * Return: the length of the resulting base64url-encoded string in bytes.
224  *         This will be equal to LLCRYPT_BASE64URL_CHARS(srclen).
225  */
226 static inline int llcrypt_base64url_encode(const u8 *src, int srclen, char *dst)
227 {
228         u32 ac = 0;
229         int bits = 0;
230         int i;
231         char *cp = dst;
232
233         for (i = 0; i < srclen; i++) {
234                 ac = (ac << 8) | src[i];
235                 bits += 8;
236                 do {
237                         bits -= 6;
238                         *cp++ = base64url_table[(ac >> bits) & 0x3f];
239                 } while (bits >= 6);
240         }
241         if (bits)
242                 *cp++ = base64url_table[(ac << (6 - bits)) & 0x3f];
243         return cp - dst;
244 }
245
246 /**
247  * llcrypt_base64url_decode() - base64url-decode a string
248  * @src: the string to decode.  Doesn't need to be NUL-terminated.
249  * @srclen: the length of @src in bytes
250  * @dst: (output) the decoded binary data
251  *
252  * Decodes a string using base64url encoding, i.e. the "Base 64 Encoding with
253  * URL and Filename Safe Alphabet" specified by RFC 4648.  '='-padding isn't
254  * accepted, nor are non-encoding characters such as whitespace.
255  *
256  * This implementation hasn't been optimized for performance.
257  *
258  * Return: the length of the resulting decoded binary data in bytes,
259  *         or -1 if the string isn't a valid base64url string.
260  */
261 static inline int llcrypt_base64url_decode(const char *src, int srclen, u8 *dst)
262 {
263         u32 ac = 0;
264         int bits = 0;
265         int i;
266         u8 *bp = dst;
267
268         for (i = 0; i < srclen; i++) {
269                 const char *p = strchr(base64url_table, src[i]);
270
271                 if (p == NULL || src[i] == 0)
272                         return -1;
273                 ac = (ac << 6) | (p - base64url_table);
274                 bits += 6;
275                 if (bits >= 8) {
276                         bits -= 8;
277                         *bp++ = (u8)(ac >> bits);
278                 }
279         }
280         if (ac & ((1 << bits) - 1))
281                 return -1;
282         return bp - dst;
283 }
284
285 static inline int base64_chars(struct lustre_sb_info *lsi, int nbytes)
286 {
287         if (!(lsi->lsi_flags & LSI_FILENAME_ENC_B64_OLD_CLI))
288                 return LLCRYPT_BASE64URL_CHARS(nbytes);
289         else
290                 return LLCRYPT_BASE64_CHARS(nbytes);
291 }
292
293 bool llcrypt_fname_encrypted_size(const struct inode *inode, u32 orig_len,
294                                   u32 max_len, u32 *encrypted_len_ret)
295 {
296         const struct llcrypt_info *ci = llcrypt_info(inode);
297         struct crypto_skcipher *tfm = ci->ci_ctfm;
298         int padding = 4 << (llcrypt_policy_flags(&ci->ci_policy) &
299                             LLCRYPT_POLICY_FLAGS_PAD_MASK);
300         u32 encrypted_len;
301
302         if (orig_len > max_len)
303                 return false;
304         if (tfm == NULL) {
305                 *encrypted_len_ret = orig_len;
306         } else {
307                 encrypted_len = max(orig_len, (u32)LL_CRYPTO_BLOCK_SIZE);
308                 encrypted_len = round_up(encrypted_len, padding);
309                 *encrypted_len_ret = min(encrypted_len, max_len);
310         }
311         return true;
312 }
313
314 /**
315  * llcrypt_fname_alloc_buffer - allocate a buffer for presented filenames
316  *
317  * Allocate a buffer that is large enough to hold any decrypted or encoded
318  * filename (null-terminated), for the given maximum encrypted filename length.
319  *
320  * Return: 0 on success, -errno on failure
321  */
322 int llcrypt_fname_alloc_buffer(const struct inode *inode,
323                                u32 max_encrypted_len,
324                                struct llcrypt_str *crypto_str)
325 {
326         struct lustre_sb_info *lsi = s2lsi(inode->i_sb);
327         const u32 max_encoded_len =
328                 max_t(u32,
329                    base64_chars(lsi, LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE),
330                    1 + base64_chars(lsi, sizeof(struct llcrypt_digested_name)));
331         u32 max_presented_len;
332
333         max_presented_len = max(max_encoded_len, max_encrypted_len);
334
335         crypto_str->name = kmalloc(max_presented_len + 1, GFP_NOFS);
336         if (!crypto_str->name)
337                 return -ENOMEM;
338         crypto_str->len = max_presented_len;
339         return 0;
340 }
341 EXPORT_SYMBOL(llcrypt_fname_alloc_buffer);
342
343 /**
344  * llcrypt_fname_free_buffer - free the buffer for presented filenames
345  *
346  * Free the buffer allocated by llcrypt_fname_alloc_buffer().
347  */
348 void llcrypt_fname_free_buffer(struct llcrypt_str *crypto_str)
349 {
350         if (!crypto_str)
351                 return;
352         kfree(crypto_str->name);
353         crypto_str->name = NULL;
354 }
355 EXPORT_SYMBOL(llcrypt_fname_free_buffer);
356
357 /**
358  * llcrypt_fname_disk_to_usr() - converts a filename from disk space to user
359  * space
360  *
361  * The caller must have allocated sufficient memory for the @oname string.
362  *
363  * If the key is available, we'll decrypt the disk name; otherwise, we'll encode
364  * it for presentation.  Short names are directly base64-encoded, while long
365  * names are encoded in llcrypt_digested_name format.
366  *
367  * Return: 0 on success, -errno on failure
368  */
369 int llcrypt_fname_disk_to_usr(struct inode *inode,
370                         u32 hash, u32 minor_hash,
371                         const struct llcrypt_str *iname,
372                         struct llcrypt_str *oname)
373 {
374         int (*b64_encode)(const u8 *src, int srclen, char *dst);
375         struct lustre_sb_info *lsi = s2lsi(inode->i_sb);
376         const struct qstr qname = LLTR_TO_QSTR(iname);
377         struct llcrypt_digested_name digested_name;
378
379         if (llcrypt_is_dot_dotdot(&qname)) {
380                 oname->name[0] = '.';
381                 oname->name[iname->len - 1] = '.';
382                 oname->len = iname->len;
383                 return 0;
384         }
385
386         if (llcrypt_has_encryption_key(inode)) {
387                 struct llcrypt_info *ci = llcrypt_info(inode);
388                 struct crypto_skcipher *tfm = ci->ci_ctfm;
389
390                 if (tfm && iname->len < LL_CRYPTO_BLOCK_SIZE)
391                         return -EUCLEAN;
392
393                 return fname_decrypt(inode, iname, oname);
394         }
395
396         if (!llcrypt_policy_has_filename_enc(inode)) {
397                 memcpy(oname->name, iname->name, iname->len);
398                 oname->name[iname->len] = '\0';
399                 oname->len = iname->len;
400                 return 0;
401         }
402
403         if (!(lsi->lsi_flags & LSI_FILENAME_ENC_B64_OLD_CLI))
404                 b64_encode = llcrypt_base64url_encode;
405         else
406                 b64_encode = llcrypt_base64_encode;
407
408         if (iname->len <= LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE) {
409                 oname->len = b64_encode(iname->name, iname->len, oname->name);
410                 return 0;
411         }
412         if (hash) {
413                 digested_name.hash = hash;
414                 digested_name.minor_hash = minor_hash;
415         } else {
416                 digested_name.hash = 0;
417                 digested_name.minor_hash = 0;
418         }
419         memcpy(digested_name.digest,
420                LLCRYPT_FNAME_DIGEST(iname->name, iname->len),
421                LLCRYPT_FNAME_DIGEST_SIZE);
422         if (!(lsi->lsi_flags & LSI_FILENAME_ENC_B64_OLD_CLI))
423                 oname->name[0] = LLCRYPT_DIGESTED_CHAR;
424         else
425                 oname->name[0] = LLCRYPT_DIGESTED_CHAR_OLD;
426         oname->len = 1 + b64_encode((const u8 *)&digested_name,
427                                     sizeof(digested_name), oname->name + 1);
428         return 0;
429 }
430 EXPORT_SYMBOL(llcrypt_fname_disk_to_usr);
431
432 /**
433  * llcrypt_setup_filename() - prepare to search a possibly encrypted directory
434  * @dir: the directory that will be searched
435  * @iname: the user-provided filename being searched for
436  * @lookup: 1 if we're allowed to proceed without the key because it's
437  *      ->lookup() or we're finding the dir_entry for deletion; 0 if we cannot
438  *      proceed without the key because we're going to create the dir_entry.
439  * @fname: the filename information to be filled in
440  *
441  * Given a user-provided filename @iname, this function sets @fname->disk_name
442  * to the name that would be stored in the on-disk directory entry, if possible.
443  * If the directory is unencrypted this is simply @iname.  Else, if we have the
444  * directory's encryption key, then @iname is the plaintext, so we encrypt it to
445  * get the disk_name.
446  *
447  * Else, for keyless @lookup operations, @iname is the presented ciphertext, so
448  * we decode it to get either the ciphertext disk_name (for short names) or the
449  * llcrypt_digested_name (for long names).  Non-@lookup operations will be
450  * impossible in this case, so we fail them with ENOKEY.
451  *
452  * If successful, llcrypt_free_filename() must be called later to clean up.
453  *
454  * Return: 0 on success, -errno on failure
455  */
456 int llcrypt_setup_filename(struct inode *dir, const struct qstr *iname,
457                               int lookup, struct llcrypt_name *fname)
458 {
459         struct lustre_sb_info *lsi = s2lsi(dir->i_sb);
460         int ret;
461         int digested;
462
463         memset(fname, 0, sizeof(struct llcrypt_name));
464         fname->usr_fname = iname;
465
466         if (!IS_ENCRYPTED(dir) || llcrypt_is_dot_dotdot(iname)) {
467                 fname->disk_name.name = (unsigned char *)iname->name;
468                 fname->disk_name.len = iname->len;
469                 return 0;
470         }
471         ret = llcrypt_get_encryption_info(dir);
472         if (ret)
473                 return ret;
474
475         if (llcrypt_has_encryption_key(dir)) {
476                 struct lustre_sb_info *lsi = s2lsi(dir->i_sb);
477
478                 if (!llcrypt_fname_encrypted_size(dir, iname->len,
479                                                   lsi ?
480                                                     lsi->lsi_cop->max_namelen :
481                                                     NAME_MAX,
482                                                   &fname->crypto_buf.len))
483                         return -ENAMETOOLONG;
484                 fname->crypto_buf.name = kmalloc(fname->crypto_buf.len,
485                                                  GFP_NOFS);
486                 if (!fname->crypto_buf.name)
487                         return -ENOMEM;
488
489                 ret = fname_encrypt(dir, iname, fname->crypto_buf.name,
490                                     fname->crypto_buf.len);
491                 if (ret)
492                         goto errout;
493                 fname->disk_name.name = fname->crypto_buf.name;
494                 fname->disk_name.len = fname->crypto_buf.len;
495                 return 0;
496         }
497         if (!lookup)
498                 return -ENOKEY;
499
500         if (!llcrypt_policy_has_filename_enc(dir)) {
501                 fname->disk_name.name = (unsigned char *)iname->name;
502                 fname->disk_name.len = iname->len;
503                 return 0;
504         }
505
506         fname->is_ciphertext_name = true;
507
508         /*
509          * We don't have the key and we are doing a lookup; decode the
510          * user-supplied name
511          */
512         if ((!(lsi->lsi_flags & LSI_FILENAME_ENC_B64_OLD_CLI) &&
513              iname->name[0] == LLCRYPT_DIGESTED_CHAR) ||
514             ((lsi->lsi_flags & LSI_FILENAME_ENC_B64_OLD_CLI) &&
515              iname->name[0] == LLCRYPT_DIGESTED_CHAR_OLD)) {
516                 if (iname->len != 1 + base64_chars(lsi,
517                                         sizeof(struct llcrypt_digested_name))) {
518                         return -ENOENT;
519                 }
520                 digested = 1;
521         } else {
522                 if (iname->len >
523                     base64_chars(lsi, LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE))
524                         return -ENOENT;
525                 digested = 0;
526         }
527
528         fname->crypto_buf.name =
529                 kmalloc(max_t(size_t, LLCRYPT_FNAME_MAX_UNDIGESTED_SIZE,
530                               sizeof(struct llcrypt_digested_name)),
531                         GFP_KERNEL);
532         if (fname->crypto_buf.name == NULL)
533                 return -ENOMEM;
534
535         if (!(lsi->lsi_flags & LSI_FILENAME_ENC_B64_OLD_CLI))
536                 ret = llcrypt_base64url_decode(iname->name + digested,
537                                                iname->len - digested,
538                                                fname->crypto_buf.name);
539         else
540                 ret = llcrypt_base64_decode(iname->name + digested,
541                                             iname->len - digested,
542                                             fname->crypto_buf.name);
543
544         if (ret < 0) {
545                 ret = -ENOENT;
546                 goto errout;
547         }
548         fname->crypto_buf.len = ret;
549         if (digested) {
550                 const struct llcrypt_digested_name *n =
551                         (const void *)fname->crypto_buf.name;
552                 fname->hash = n->hash;
553                 fname->minor_hash = n->minor_hash;
554         } else {
555                 fname->disk_name.name = fname->crypto_buf.name;
556                 fname->disk_name.len = fname->crypto_buf.len;
557         }
558         return 0;
559
560 errout:
561         kfree(fname->crypto_buf.name);
562         return ret;
563 }
564 EXPORT_SYMBOL(llcrypt_setup_filename);