Skip to content

Commit 187ec60

Browse files
gh-148016: Improve "Leading padding not allowed" error in Base32 and Base64 decoders
It is now raised instead of "Excess padding not allowed" if all characters preceding "=" were ignored.
1 parent 86b8617 commit 187ec60

2 files changed

Lines changed: 16 additions & 11 deletions

File tree

Lib/test/test_binascii.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -159,20 +159,20 @@ def addnoise(line):
159159
def test_base64_bad_padding(self):
160160
# Test malformed padding
161161
def _assertRegexTemplate(assert_regex, data,
162-
non_strict_mode_expected_result):
162+
non_strict_mode_expected_result, **kwargs):
163163
data = self.type2test(data)
164164
with self.assertRaisesRegex(binascii.Error, assert_regex):
165-
binascii.a2b_base64(data, strict_mode=True)
165+
binascii.a2b_base64(data, strict_mode=True, **kwargs)
166166
self.assertEqual(binascii.a2b_base64(data, strict_mode=False),
167167
non_strict_mode_expected_result)
168168
self.assertEqual(binascii.a2b_base64(data, strict_mode=True,
169-
ignorechars=b'='),
169+
ignorechars=b' ='),
170170
non_strict_mode_expected_result)
171171
self.assertEqual(binascii.a2b_base64(data),
172172
non_strict_mode_expected_result)
173173

174-
def assertLeadingPadding(*args):
175-
_assertRegexTemplate(r'(?i)Leading padding', *args)
174+
def assertLeadingPadding(*args, **kwargs):
175+
_assertRegexTemplate(r'(?i)Leading padding', *args, **kwargs)
176176

177177
def assertDiscontinuousPadding(*args):
178178
_assertRegexTemplate(r'(?i)Discontinuous padding', *args)
@@ -200,6 +200,7 @@ def assertInvalidLength(*args):
200200
assertLeadingPadding(b'===abcd', b'i\xb7\x1d')
201201
assertLeadingPadding(b'====abcd', b'i\xb7\x1d')
202202
assertLeadingPadding(b'=====abcd', b'i\xb7\x1d')
203+
assertLeadingPadding(b' =abcd', b'i\xb7\x1d', ignorechars=b' ')
203204

204205
assertInvalidLength(b'a=b==', b'i')
205206
assertInvalidLength(b'a=bc=', b'i\xb7')
@@ -763,9 +764,10 @@ def _fixPadding(data):
763764
p = 8 - len_8 if len_8 else 0
764765
return fixed + b"=" * p
765766

766-
def _assertRegexTemplate(assert_regex, data, good_padding_result=None):
767+
def _assertRegexTemplate(assert_regex, data, good_padding_result=None,
768+
**kwargs):
767769
with self.assertRaisesRegex(binascii.Error, assert_regex):
768-
binascii.a2b_base32(self.type2test(data))
770+
binascii.a2b_base32(self.type2test(data), **kwargs)
769771
if good_padding_result:
770772
fixed = self.type2test(_fixPadding(data))
771773
self.assertEqual(binascii.a2b_base32(fixed), good_padding_result)
@@ -779,8 +781,8 @@ def assertExcessData(*args):
779781
def assertExcessPadding(*args):
780782
_assertRegexTemplate(r"(?i)Excess padding", *args)
781783

782-
def assertLeadingPadding(*args):
783-
_assertRegexTemplate(r"(?i)Leading padding", *args)
784+
def assertLeadingPadding(*args, **kwargs):
785+
_assertRegexTemplate(r"(?i)Leading padding", *args, **kwargs)
784786

785787
def assertIncorrectPadding(*args):
786788
_assertRegexTemplate(r"(?i)Incorrect padding", *args)
@@ -844,6 +846,7 @@ def assertInvalidLength(*args):
844846
assertLeadingPadding(b"=======BEEFCAKE", b"\t\x08Q\x01D")
845847
assertLeadingPadding(b"========BEEFCAKE", b"\t\x08Q\x01D")
846848
assertLeadingPadding(b"=========BEEFCAKE", b"\t\x08Q\x01D")
849+
assertLeadingPadding(b" =BEEFCAKE", ignorechars=b' ')
847850

848851
assertIncorrectPadding(b"AB")
849852
assertIncorrectPadding(b"ABCD")

Modules/binascii.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -816,8 +816,9 @@ binascii_a2b_base64_impl(PyObject *module, Py_buffer *data, int strict_mode,
816816
}
817817
state = get_binascii_state(module);
818818
if (state) {
819+
unsigned char *bin_data_start = PyBytesWriter_GetData(writer);
819820
PyErr_SetString(state->Error,
820-
(quad_pos == 0 && ascii_data == data->buf)
821+
(quad_pos == 0 && bin_data == bin_data_start)
821822
? "Leading padding not allowed"
822823
: "Excess padding not allowed");
823824
}
@@ -1601,8 +1602,9 @@ binascii_a2b_base32_impl(PyObject *module, Py_buffer *data,
16011602
}
16021603
state = get_binascii_state(module);
16031604
if (state) {
1605+
unsigned char *bin_data_start = PyBytesWriter_GetData(writer);
16041606
PyErr_SetString(state->Error,
1605-
(octa_pos == 0 && ascii_data == data->buf)
1607+
(octa_pos == 0 && bin_data == bin_data_start)
16061608
? "Leading padding not allowed"
16071609
: "Excess padding not allowed");
16081610
}

0 commit comments

Comments
 (0)