diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2018-07-24 09:52:51 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-24 09:52:51 (GMT) |
commit | ac0b3c2f4d86fc056b833a4e6b9a380741244a63 (patch) | |
tree | 146851a1151628b64bae4ee7f867a78ccba692c9 /Lib/base64.py | |
parent | 02ec92fa7b1dddc23d479ee0b87dc283793505a8 (diff) | |
download | cpython-ac0b3c2f4d86fc056b833a4e6b9a380741244a63.zip cpython-ac0b3c2f4d86fc056b833a4e6b9a380741244a63.tar.gz cpython-ac0b3c2f4d86fc056b833a4e6b9a380741244a63.tar.bz2 |
bpo-34164: Fix handling of incorrect padding in base64.b32decode(). (GH-8351)
Now base64.Error is always raised instead of UnboundLocalError or
OverflowError.
Diffstat (limited to 'Lib/base64.py')
-rwxr-xr-x | Lib/base64.py | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/Lib/base64.py b/Lib/base64.py index eb8f258..2be9c39 100755 --- a/Lib/base64.py +++ b/Lib/base64.py @@ -231,23 +231,16 @@ def b32decode(s, casefold=False, map01=None): raise binascii.Error('Non-base32 digit found') from None decoded += acc.to_bytes(5, 'big') # Process the last, partial quanta - if padchars: + if l % 8 or padchars not in {0, 1, 3, 4, 6}: + raise binascii.Error('Incorrect padding') + if padchars and decoded: acc <<= 5 * padchars last = acc.to_bytes(5, 'big') - if padchars == 1: - decoded[-5:] = last[:-1] - elif padchars == 3: - decoded[-5:] = last[:-2] - elif padchars == 4: - decoded[-5:] = last[:-3] - elif padchars == 6: - decoded[-5:] = last[:-4] - else: - raise binascii.Error('Incorrect padding') + leftover = (43 - 5 * padchars) // 8 # 1: 4, 3: 3, 4: 2, 6: 1 + decoded[-5:] = last[:leftover] return bytes(decoded) - # RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns # lowercase. The RFC also recommends against accepting input case # insensitively. |