]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: base64 - Add BASE64_DECODE_FLAG_IGNORE_PADDING.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 27 Aug 2019 23:21:01 +0000 (01:21 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 10 Sep 2019 07:02:30 +0000 (10:02 +0300)
Makes padding optional rather than either disallowed or required.

src/lib/base64.c
src/lib/base64.h
src/lib/test-base64.c

index 35e0a558a1244a68c233f160b8295307174d5a24..54f50923a0c8518af62da33f8858ed0cfe6eee43 100644 (file)
@@ -672,7 +672,12 @@ int base64_decode_finish(struct base64_decoder *dec)
                return -1;
 
        if (HAS_ALL_BITS(dec->flags,
-                        BASE64_DECODE_FLAG_NO_PADDING))
+                        BASE64_DECODE_FLAG_NO_PADDING)) {
+               i_assert(!dec->seen_padding);
+               return 0;
+       }
+       if (HAS_ALL_BITS(dec->flags,
+                        BASE64_DECODE_FLAG_IGNORE_PADDING))
                return 0;
        return (dec->sub_pos == 0 ? 0 : -1);
 }
index 28215529eb58544a849a7566226fc20d17c35a2e..3663041ecd135a9ad167aa0a1cb8a0f287c3b3b5 100644 (file)
@@ -118,6 +118,10 @@ enum base64_decode_flags {
        BASE64_DECODE_FLAG_NO_WHITESPACE   = BIT(1),
        /* Require absence of padding at the end of the input. */
        BASE64_DECODE_FLAG_NO_PADDING      = BIT(2),
+       /* Ignore padding at the end of the input. This flag is ignored when
+          BASE64_DECODE_FLAG_NO_PADDING is also set. If both of these flags are
+          absent, padding is required (the default). */
+       BASE64_DECODE_FLAG_IGNORE_PADDING  = BIT(3),
 };
 
 struct base64_decoder {
index e9e08dcb41763c77b217d0459cc18f6be0630c41..d94500d404c192fb635a2070cd40a898c198093e 100644 (file)
@@ -534,6 +534,22 @@ tests_base64_decode_lowlevel[] = {
                .ret = 0,
                .src_pos = 16,
        },
+       {
+               .scheme = &base64_scheme,
+               .flags = BASE64_DECODE_FLAG_IGNORE_PADDING,
+               .input = "\taGVsbG8gd29ybGQ=",
+               .output = "hello world",
+               .ret = 0,
+               .src_pos = 17,
+       },
+       {
+               .scheme = &base64_scheme,
+               .flags = BASE64_DECODE_FLAG_IGNORE_PADDING,
+               .input = "\taGVsbG8gd29ybGQ",
+               .output = "hello world",
+               .ret = 0,
+               .src_pos = 16,
+       },
        {
                .scheme = &base64_scheme,
                .input = "\nZm9v\n \tIGJh  \t\ncml0cw==",
@@ -585,6 +601,22 @@ tests_base64_decode_lowlevel[] = {
                .ret = 0,
                .src_pos = 22,
        },
+       {
+               .scheme = &base64_scheme,
+               .flags = BASE64_DECODE_FLAG_IGNORE_PADDING,
+               .input = "\nZm9v\n \tIGJh  \t\ncml0cw==",
+               .output = "foo barits",
+               .ret = 0,
+               .src_pos = 24,
+       },
+       {
+               .scheme = &base64_scheme,
+               .flags = BASE64_DECODE_FLAG_IGNORE_PADDING,
+               .input = "\nZm9v\n \tIGJh  \t\ncml0cw",
+               .output = "foo barits",
+               .ret = 0,
+               .src_pos = 22,
+       },
        {
                .scheme = &base64_scheme,
                .input = "  anVzdCBuaWlu  \n",
@@ -607,6 +639,14 @@ tests_base64_decode_lowlevel[] = {
                .ret = 0,
                .src_pos = UINT_MAX,
        },
+       {
+               .scheme = &base64_scheme,
+               .flags = BASE64_DECODE_FLAG_IGNORE_PADDING,
+               .input = "  anVzdCBuaWlu  \n",
+               .output = "just niin",
+               .ret = 0,
+               .src_pos = UINT_MAX,
+       },
        {
                .scheme = &base64_scheme,
                .input = "aGVsb",
@@ -629,6 +669,14 @@ tests_base64_decode_lowlevel[] = {
                .ret = 0,
                .src_pos = 5,
        },
+       {
+               .scheme = &base64_scheme,
+               .flags = BASE64_DECODE_FLAG_IGNORE_PADDING,
+               .input = "aGVsb",
+               .output = "hel",
+               .ret = 0,
+               .src_pos = 5,
+       },
        {
                .scheme = &base64_scheme,
                .input = "aGVsb!!!!!",
@@ -697,6 +745,34 @@ tests_base64_decode_lowlevel[] = {
                .ret = 0,
                .src_pos = UINT_MAX,
        },
+       {
+               .scheme = &base64_scheme,
+               .flags = BASE64_DECODE_FLAG_IGNORE_PADDING,
+               .input =
+                       "0JPQvtCy0L7RgNGPzIHRgiwg0YfRgt"
+                       "C+INC60YPRgCDQtNC+0Y/MgdGCLg",
+               .output =
+                       "\xd0\x93\xd0\xbe\xd0\xb2\xd0\xbe\xd1\x80\xd1\x8f\xcc"
+                       "\x81\xd1\x82\x2c\x20\xd1\x87\xd1\x82\xd0\xbe\x20\xd0"
+                       "\xba\xd1\x83\xd1\x80\x20\xd0\xb4\xd0\xbe\xd1\x8f\xcc"
+                       "\x81\xd1\x82\x2e",
+               .ret = 0,
+               .src_pos = UINT_MAX,
+       },
+       {
+               .scheme = &base64_scheme,
+               .flags = BASE64_DECODE_FLAG_IGNORE_PADDING,
+               .input =
+                       "0JPQvtCy0L7RgNGPzIHRgiwg0YfRgt"
+                       "C+INC60YPRgCDQtNC+0Y/MgdGCLg==",
+               .output =
+                       "\xd0\x93\xd0\xbe\xd0\xb2\xd0\xbe\xd1\x80\xd1\x8f\xcc"
+                       "\x81\xd1\x82\x2c\x20\xd1\x87\xd1\x82\xd0\xbe\x20\xd0"
+                       "\xba\xd1\x83\xd1\x80\x20\xd0\xb4\xd0\xbe\xd1\x8f\xcc"
+                       "\x81\xd1\x82\x2e",
+               .ret = 0,
+               .src_pos = UINT_MAX,
+       },
 };
 
 static void test_base64_decode_lowlevel(void)