From: Stephan Bosch Date: Tue, 27 Aug 2019 23:21:01 +0000 (+0200) Subject: lib: base64 - Add BASE64_DECODE_FLAG_IGNORE_PADDING. X-Git-Tag: 2.3.9~265 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=23a9a74534aa3bdfe4d15bbbe84a02410de657f6;p=thirdparty%2Fdovecot%2Fcore.git lib: base64 - Add BASE64_DECODE_FLAG_IGNORE_PADDING. Makes padding optional rather than either disallowed or required. --- diff --git a/src/lib/base64.c b/src/lib/base64.c index 35e0a558a1..54f50923a0 100644 --- a/src/lib/base64.c +++ b/src/lib/base64.c @@ -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); } diff --git a/src/lib/base64.h b/src/lib/base64.h index 28215529eb..3663041ecd 100644 --- a/src/lib/base64.h +++ b/src/lib/base64.h @@ -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 { diff --git a/src/lib/test-base64.c b/src/lib/test-base64.c index e9e08dcb41..d94500d404 100644 --- a/src/lib/test-base64.c +++ b/src/lib/test-base64.c @@ -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)