diff options
author | Andrew M. Kuchling <amk@amk.ca> | 2005-06-08 22:51:38 (GMT) |
---|---|---|
committer | Andrew M. Kuchling <amk@amk.ca> | 2005-06-08 22:51:38 (GMT) |
commit | 6e57c2a6532d6f1158586232452a3b440e975b98 (patch) | |
tree | ae0fffcb88a34fc56dab07dc721e7b9c48b8799e | |
parent | 8dbe1a70d788d91dd8851b92557d5e1a011f56f7 (diff) | |
download | cpython-6e57c2a6532d6f1158586232452a3b440e975b98.zip cpython-6e57c2a6532d6f1158586232452a3b440e975b98.tar.gz cpython-6e57c2a6532d6f1158586232452a3b440e975b98.tar.bz2 |
[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
-rwxr-xr-x | Lib/base64.py | 10 | ||||
-rw-r--r-- | Lib/test/test_base64.py | 6 |
2 files changed, 12 insertions, 4 deletions
diff --git a/Lib/base64.py b/Lib/base64.py index f90b91d..8914acc 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -221,12 +221,14 @@ def b32decode(s, casefold=False, map01=None): acc += _b32rev[c] << shift shift -= 5 if shift < 0: - parts.append(binascii.unhexlify(hex(acc)[2:-1])) + parts.append(binascii.unhexlify('%010x' % acc)) acc = 0 shift = 35 # Process the last, partial quanta - last = binascii.unhexlify(hex(acc)[2:-1]) - if padchars == 1: + last = binascii.unhexlify('%010x' % acc) + if padchars == 0: + last = '' # No characters + elif padchars == 1: last = last[:-1] elif padchars == 3: last = last[:-2] @@ -234,7 +236,7 @@ def b32decode(s, casefold=False, map01=None): last = last[:-3] elif padchars == 6: last = last[:-4] - elif padchars <> 0: + else: raise TypeError('Incorrect padding') parts.append(last) return EMPTYSTRING.join(parts) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py index a7fa2b9..997a413 100644 --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -60,6 +60,7 @@ class BaseXYTestCase(unittest.TestCase): eq = self.assertEqual # Test default alphabet eq(base64.b64encode("www.python.org"), "d3d3LnB5dGhvbi5vcmc=") + eq(base64.b64encode('\x00'), 'AA==') eq(base64.b64encode("a"), "YQ==") eq(base64.b64encode("ab"), "YWI=") eq(base64.b64encode("abc"), "YWJj") @@ -90,6 +91,7 @@ class BaseXYTestCase(unittest.TestCase): def test_b64decode(self): eq = self.assertEqual eq(base64.b64decode("d3d3LnB5dGhvbi5vcmc="), "www.python.org") + eq(base64.b64decode('AA=='), '\x00') eq(base64.b64decode("YQ=="), "a") eq(base64.b64decode("YWI="), "ab") eq(base64.b64decode("YWJj"), "abc") @@ -123,6 +125,7 @@ class BaseXYTestCase(unittest.TestCase): def test_b32encode(self): eq = self.assertEqual eq(base64.b32encode(''), '') + eq(base64.b32encode('\x00'), 'AA======') eq(base64.b32encode('a'), 'ME======') eq(base64.b32encode('ab'), 'MFRA====') eq(base64.b32encode('abc'), 'MFRGG===') @@ -132,6 +135,7 @@ class BaseXYTestCase(unittest.TestCase): def test_b32decode(self): eq = self.assertEqual eq(base64.b32decode(''), '') + eq(base64.b32decode('AA======'), '\x00') eq(base64.b32decode('ME======'), 'a') eq(base64.b32decode('MFRA===='), 'ab') eq(base64.b32decode('MFRGG==='), 'abc') @@ -166,10 +170,12 @@ class BaseXYTestCase(unittest.TestCase): def test_b16encode(self): eq = self.assertEqual eq(base64.b16encode('\x01\x02\xab\xcd\xef'), '0102ABCDEF') + eq(base64.b16encode('\x00'), '00') def test_b16decode(self): eq = self.assertEqual eq(base64.b16decode('0102ABCDEF'), '\x01\x02\xab\xcd\xef') + eq(base64.b16decode('00'), '\x00') # Lower case is not allowed without a flag self.assertRaises(TypeError, base64.b16decode, '0102abcdef') # Case fold |