]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
fscrypt: clean up base64 encoding/decoding
authorEric Biggers <ebiggers@google.com>
Wed, 24 Jul 2019 18:07:58 +0000 (11:07 -0700)
committerEric Biggers <ebiggers@google.com>
Tue, 13 Aug 2019 02:04:44 +0000 (19:04 -0700)
Some minor cleanups for the code that base64 encodes and decodes
encrypted filenames and long name digests:

- Rename "digest_{encode,decode}()" => "base64_{encode,decode}()" since
  they are used for filenames too, not just for long name digests.
- Replace 'while' loops with more conventional 'for' loops.
- Use 'u8' for binary data.  Keep 'char' for string data.
- Fully constify the lookup table (pointer was not const).
- Improve comment.

No actual change in behavior.

Signed-off-by: Eric Biggers <ebiggers@google.com>
fs/crypto/fname.c

index 00d150ff30332bea40f6d1a8cac62261c760822e..6f9daba991684e2b556e6bcfbbe495ddd0c01d21 100644 (file)
@@ -127,44 +127,45 @@ static int fname_decrypt(struct inode *inode,
        return 0;
 }
 
-static const char *lookup_table =
+static const char lookup_table[65] =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,";
 
 #define BASE64_CHARS(nbytes)   DIV_ROUND_UP((nbytes) * 4, 3)
 
 /**
- * digest_encode() -
+ * base64_encode() -
  *
- * Encodes the input digest using characters from the set [a-zA-Z0-9_+].
+ * Encodes the input string using characters from the set [A-Za-z0-9+,].
  * The encoded string is roughly 4/3 times the size of the input string.
+ *
+ * Return: length of the encoded string
  */
-static int digest_encode(const char *src, int len, char *dst)
+static int base64_encode(const u8 *src, int len, char *dst)
 {
-       int i = 0, bits = 0, ac = 0;
+       int i, bits = 0, ac = 0;
        char *cp = dst;
 
-       while (i < len) {
-               ac += (((unsigned char) src[i]) << bits);
+       for (i = 0; i < len; i++) {
+               ac += src[i] << bits;
                bits += 8;
                do {
                        *cp++ = lookup_table[ac & 0x3f];
                        ac >>= 6;
                        bits -= 6;
                } while (bits >= 6);
-               i++;
        }
        if (bits)
                *cp++ = lookup_table[ac & 0x3f];
        return cp - dst;
 }
 
-static int digest_decode(const char *src, int len, char *dst)
+static int base64_decode(const char *src, int len, u8 *dst)
 {
-       int i = 0, bits = 0, ac = 0;
+       int i, bits = 0, ac = 0;
        const char *p;
-       char *cp = dst;
+       u8 *cp = dst;
 
-       while (i < len) {
+       for (i = 0; i < len; i++) {
                p = strchr(lookup_table, src[i]);
                if (p == NULL || src[i] == 0)
                        return -2;
@@ -175,7 +176,6 @@ static int digest_decode(const char *src, int len, char *dst)
                        ac >>= 8;
                        bits -= 8;
                }
-               i++;
        }
        if (ac)
                return -1;
@@ -272,7 +272,7 @@ int fscrypt_fname_disk_to_usr(struct inode *inode,
                return fname_decrypt(inode, iname, oname);
 
        if (iname->len <= FSCRYPT_FNAME_MAX_UNDIGESTED_SIZE) {
-               oname->len = digest_encode(iname->name, iname->len,
+               oname->len = base64_encode(iname->name, iname->len,
                                           oname->name);
                return 0;
        }
@@ -287,7 +287,7 @@ int fscrypt_fname_disk_to_usr(struct inode *inode,
               FSCRYPT_FNAME_DIGEST(iname->name, iname->len),
               FSCRYPT_FNAME_DIGEST_SIZE);
        oname->name[0] = '_';
-       oname->len = 1 + digest_encode((const char *)&digested_name,
+       oname->len = 1 + base64_encode((const u8 *)&digested_name,
                                       sizeof(digested_name), oname->name + 1);
        return 0;
 }
@@ -380,8 +380,8 @@ int fscrypt_setup_filename(struct inode *dir, const struct qstr *iname,
        if (fname->crypto_buf.name == NULL)
                return -ENOMEM;
 
-       ret = digest_decode(iname->name + digested, iname->len - digested,
-                               fname->crypto_buf.name);
+       ret = base64_decode(iname->name + digested, iname->len - digested,
+                           fname->crypto_buf.name);
        if (ret < 0) {
                ret = -ENOENT;
                goto errout;