summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMartin Panter <vadmium+py@gmail.com>2016-02-23 22:30:50 (GMT)
committerMartin Panter <vadmium+py@gmail.com>2016-02-23 22:30:50 (GMT)
commit39267c21cc8e5e7bc8facd1260eac212b9ebeefd (patch)
tree564cf5a6df7e0172901e1b5f0b8ca4368e10c67d /Lib
parent3058eb418a3374ddb9ae8b7f29f4ebd072837dd7 (diff)
downloadcpython-39267c21cc8e5e7bc8facd1260eac212b9ebeefd.zip
cpython-39267c21cc8e5e7bc8facd1260eac212b9ebeefd.tar.gz
cpython-39267c21cc8e5e7bc8facd1260eac212b9ebeefd.tar.bz2
Issue #22088: Clarify base-64 alphabets and which characters are discarded
* There are only two base-64 alphabets defined by the RFCs, not three * Due to the internal translation, plus (+) and slash (/) are never discarded * standard_ and urlsafe_b64decode() discard characters as well
Diffstat (limited to 'Lib')
-rwxr-xr-xLib/base64.py29
-rw-r--r--Lib/test/test_base64.py11
2 files changed, 27 insertions, 13 deletions
diff --git a/Lib/base64.py b/Lib/base64.py
index 844907f..38bc61e 100755
--- a/Lib/base64.py
+++ b/Lib/base64.py
@@ -65,8 +65,9 @@ def b64decode(s, altchars=None):
alternative alphabet used instead of the '+' and '/' characters.
The decoded string is returned. A TypeError is raised if s is
- incorrectly padded. Non-base64-alphabet characters are discarded prior
- to the padding check.
+ incorrectly padded. Characters that are neither in the normal base-64
+ alphabet nor the alternative alphabet are discarded prior to the padding
+ check.
"""
if altchars is not None:
s = s.translate(string.maketrans(altchars[:2], '+/'))
@@ -87,9 +88,10 @@ def standard_b64encode(s):
def standard_b64decode(s):
"""Decode a string encoded with the standard Base64 alphabet.
- s is the string to decode. The decoded string is returned. A TypeError
- is raised if the string is incorrectly padded or if there are non-alphabet
- characters present in the string.
+ Argument s is the string to decode. The decoded string is returned. A
+ TypeError is raised if the string is incorrectly padded. Characters that
+ are not in the standard alphabet are discarded prior to the padding
+ check.
"""
return b64decode(s)
@@ -97,19 +99,20 @@ _urlsafe_encode_translation = string.maketrans(b'+/', b'-_')
_urlsafe_decode_translation = string.maketrans(b'-_', b'+/')
def urlsafe_b64encode(s):
- """Encode a string using a url-safe Base64 alphabet.
+ """Encode a string using the URL- and filesystem-safe Base64 alphabet.
- s is the string to encode. The encoded string is returned. The alphabet
- uses '-' instead of '+' and '_' instead of '/'.
+ Argument s is the string to encode. The encoded string is returned. The
+ alphabet uses '-' instead of '+' and '_' instead of '/'.
"""
return b64encode(s).translate(_urlsafe_encode_translation)
def urlsafe_b64decode(s):
- """Decode a string encoded with the standard Base64 alphabet.
+ """Decode a string using the URL- and filesystem-safe Base64 alphabet.
- s is the string to decode. The decoded string is returned. A TypeError
- is raised if the string is incorrectly padded or if there are non-alphabet
- characters present in the string.
+ Argument s is the string to decode. The decoded string is returned. A
+ TypeError is raised if the string is incorrectly padded. Characters that
+ are not in the URL-safe base-64 alphabet, and are not a plus '+' or slash
+ '/', are discarded prior to the padding check.
The alphabet uses '-' instead of '+' and '_' instead of '/'.
"""
@@ -267,7 +270,7 @@ def b16decode(s, casefold=False):
a lowercase alphabet is acceptable as input. For security purposes, the
default is False.
- The decoded string is returned. A TypeError is raised if s were
+ The decoded string is returned. A TypeError is raised if s is
incorrectly padded or if there are non-alphabet characters present in the
string.
"""
diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py
index 5dd283b..6e67dc0 100644
--- a/Lib/test/test_base64.py
+++ b/Lib/test/test_base64.py
@@ -153,6 +153,13 @@ class BaseXYTestCase(unittest.TestCase):
(b'YWJj\nYWI=', b'abcab'))
for bstr, res in tests:
self.assertEqual(base64.b64decode(bstr), res)
+ self.assertEqual(base64.standard_b64decode(bstr), res)
+ self.assertEqual(base64.urlsafe_b64decode(bstr), res)
+
+ # Normal alphabet characters not discarded when alternative given
+ res = b'\xFB\xEF\xBE\xFF\xFF\xFF'
+ self.assertEqual(base64.b64decode(b'++[[//]]', b'[]'), res)
+ self.assertEqual(base64.urlsafe_b64decode(b'++--//__'), res)
def test_b32encode(self):
eq = self.assertEqual
@@ -220,6 +227,10 @@ class BaseXYTestCase(unittest.TestCase):
eq(base64.b16decode('0102abcdef', True), '\x01\x02\xab\xcd\xef')
# Non-bytes
eq(base64.b16decode(bytearray("0102ABCDEF")), '\x01\x02\xab\xcd\xef')
+ # Non-alphabet characters
+ self.assertRaises(TypeError, base64.b16decode, '0102AG')
+ # Incorrect "padding"
+ self.assertRaises(TypeError, base64.b16decode, '010')