mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
[Patch #1171487, bug #1170331] Fix error in base64.b32decode when encoding a single null byte; test a null byte in all encodings to be sure it works
This commit is contained in:
parent
8dbe1a70d7
commit
6e57c2a653
2 changed files with 12 additions and 4 deletions
|
@ -221,12 +221,14 @@ def b32decode(s, casefold=False, map01=None):
|
||||||
acc += _b32rev[c] << shift
|
acc += _b32rev[c] << shift
|
||||||
shift -= 5
|
shift -= 5
|
||||||
if shift < 0:
|
if shift < 0:
|
||||||
parts.append(binascii.unhexlify(hex(acc)[2:-1]))
|
parts.append(binascii.unhexlify('%010x' % acc))
|
||||||
acc = 0
|
acc = 0
|
||||||
shift = 35
|
shift = 35
|
||||||
# Process the last, partial quanta
|
# Process the last, partial quanta
|
||||||
last = binascii.unhexlify(hex(acc)[2:-1])
|
last = binascii.unhexlify('%010x' % acc)
|
||||||
if padchars == 1:
|
if padchars == 0:
|
||||||
|
last = '' # No characters
|
||||||
|
elif padchars == 1:
|
||||||
last = last[:-1]
|
last = last[:-1]
|
||||||
elif padchars == 3:
|
elif padchars == 3:
|
||||||
last = last[:-2]
|
last = last[:-2]
|
||||||
|
@ -234,7 +236,7 @@ def b32decode(s, casefold=False, map01=None):
|
||||||
last = last[:-3]
|
last = last[:-3]
|
||||||
elif padchars == 6:
|
elif padchars == 6:
|
||||||
last = last[:-4]
|
last = last[:-4]
|
||||||
elif padchars <> 0:
|
else:
|
||||||
raise TypeError('Incorrect padding')
|
raise TypeError('Incorrect padding')
|
||||||
parts.append(last)
|
parts.append(last)
|
||||||
return EMPTYSTRING.join(parts)
|
return EMPTYSTRING.join(parts)
|
||||||
|
|
|
@ -60,6 +60,7 @@ class BaseXYTestCase(unittest.TestCase):
|
||||||
eq = self.assertEqual
|
eq = self.assertEqual
|
||||||
# Test default alphabet
|
# Test default alphabet
|
||||||
eq(base64.b64encode("www.python.org"), "d3d3LnB5dGhvbi5vcmc=")
|
eq(base64.b64encode("www.python.org"), "d3d3LnB5dGhvbi5vcmc=")
|
||||||
|
eq(base64.b64encode('\x00'), 'AA==')
|
||||||
eq(base64.b64encode("a"), "YQ==")
|
eq(base64.b64encode("a"), "YQ==")
|
||||||
eq(base64.b64encode("ab"), "YWI=")
|
eq(base64.b64encode("ab"), "YWI=")
|
||||||
eq(base64.b64encode("abc"), "YWJj")
|
eq(base64.b64encode("abc"), "YWJj")
|
||||||
|
@ -90,6 +91,7 @@ class BaseXYTestCase(unittest.TestCase):
|
||||||
def test_b64decode(self):
|
def test_b64decode(self):
|
||||||
eq = self.assertEqual
|
eq = self.assertEqual
|
||||||
eq(base64.b64decode("d3d3LnB5dGhvbi5vcmc="), "www.python.org")
|
eq(base64.b64decode("d3d3LnB5dGhvbi5vcmc="), "www.python.org")
|
||||||
|
eq(base64.b64decode('AA=='), '\x00')
|
||||||
eq(base64.b64decode("YQ=="), "a")
|
eq(base64.b64decode("YQ=="), "a")
|
||||||
eq(base64.b64decode("YWI="), "ab")
|
eq(base64.b64decode("YWI="), "ab")
|
||||||
eq(base64.b64decode("YWJj"), "abc")
|
eq(base64.b64decode("YWJj"), "abc")
|
||||||
|
@ -123,6 +125,7 @@ class BaseXYTestCase(unittest.TestCase):
|
||||||
def test_b32encode(self):
|
def test_b32encode(self):
|
||||||
eq = self.assertEqual
|
eq = self.assertEqual
|
||||||
eq(base64.b32encode(''), '')
|
eq(base64.b32encode(''), '')
|
||||||
|
eq(base64.b32encode('\x00'), 'AA======')
|
||||||
eq(base64.b32encode('a'), 'ME======')
|
eq(base64.b32encode('a'), 'ME======')
|
||||||
eq(base64.b32encode('ab'), 'MFRA====')
|
eq(base64.b32encode('ab'), 'MFRA====')
|
||||||
eq(base64.b32encode('abc'), 'MFRGG===')
|
eq(base64.b32encode('abc'), 'MFRGG===')
|
||||||
|
@ -132,6 +135,7 @@ class BaseXYTestCase(unittest.TestCase):
|
||||||
def test_b32decode(self):
|
def test_b32decode(self):
|
||||||
eq = self.assertEqual
|
eq = self.assertEqual
|
||||||
eq(base64.b32decode(''), '')
|
eq(base64.b32decode(''), '')
|
||||||
|
eq(base64.b32decode('AA======'), '\x00')
|
||||||
eq(base64.b32decode('ME======'), 'a')
|
eq(base64.b32decode('ME======'), 'a')
|
||||||
eq(base64.b32decode('MFRA===='), 'ab')
|
eq(base64.b32decode('MFRA===='), 'ab')
|
||||||
eq(base64.b32decode('MFRGG==='), 'abc')
|
eq(base64.b32decode('MFRGG==='), 'abc')
|
||||||
|
@ -166,10 +170,12 @@ class BaseXYTestCase(unittest.TestCase):
|
||||||
def test_b16encode(self):
|
def test_b16encode(self):
|
||||||
eq = self.assertEqual
|
eq = self.assertEqual
|
||||||
eq(base64.b16encode('\x01\x02\xab\xcd\xef'), '0102ABCDEF')
|
eq(base64.b16encode('\x01\x02\xab\xcd\xef'), '0102ABCDEF')
|
||||||
|
eq(base64.b16encode('\x00'), '00')
|
||||||
|
|
||||||
def test_b16decode(self):
|
def test_b16decode(self):
|
||||||
eq = self.assertEqual
|
eq = self.assertEqual
|
||||||
eq(base64.b16decode('0102ABCDEF'), '\x01\x02\xab\xcd\xef')
|
eq(base64.b16decode('0102ABCDEF'), '\x01\x02\xab\xcd\xef')
|
||||||
|
eq(base64.b16decode('00'), '\x00')
|
||||||
# Lower case is not allowed without a flag
|
# Lower case is not allowed without a flag
|
||||||
self.assertRaises(TypeError, base64.b16decode, '0102abcdef')
|
self.assertRaises(TypeError, base64.b16decode, '0102abcdef')
|
||||||
# Case fold
|
# Case fold
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue