Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6e57c2a

Browse files
committed
[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
1 parent 8dbe1a7 commit 6e57c2a

2 files changed

Lines changed: 12 additions & 4 deletions

File tree

Lib/base64.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,20 +221,22 @@ def b32decode(s, casefold=False, map01=None):
221221
acc += _b32rev[c] << shift
222222
shift -= 5
223223
if shift < 0:
224-
parts.append(binascii.unhexlify(hex(acc)[2:-1]))
224+
parts.append(binascii.unhexlify('%010x' % acc))
225225
acc = 0
226226
shift = 35
227227
# Process the last, partial quanta
228-
last = binascii.unhexlify(hex(acc)[2:-1])
229-
if padchars == 1:
228+
last = binascii.unhexlify('%010x' % acc)
229+
if padchars == 0:
230+
last = '' # No characters
231+
elif padchars == 1:
230232
last = last[:-1]
231233
elif padchars == 3:
232234
last = last[:-2]
233235
elif padchars == 4:
234236
last = last[:-3]
235237
elif padchars == 6:
236238
last = last[:-4]
237-
elif padchars <> 0:
239+
else:
238240
raise TypeError('Incorrect padding')
239241
parts.append(last)
240242
return EMPTYSTRING.join(parts)

Lib/test/test_base64.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def test_b64encode(self):
6060
eq = self.assertEqual
6161
# Test default alphabet
6262
eq(base64.b64encode("www.python.org"), "d3d3LnB5dGhvbi5vcmc=")
63+
eq(base64.b64encode('\x00'), 'AA==')
6364
eq(base64.b64encode("a"), "YQ==")
6465
eq(base64.b64encode("ab"), "YWI=")
6566
eq(base64.b64encode("abc"), "YWJj")
@@ -90,6 +91,7 @@ def test_b64encode(self):
9091
def test_b64decode(self):
9192
eq = self.assertEqual
9293
eq(base64.b64decode("d3d3LnB5dGhvbi5vcmc="), "www.python.org")
94+
eq(base64.b64decode('AA=='), '\x00')
9395
eq(base64.b64decode("YQ=="), "a")
9496
eq(base64.b64decode("YWI="), "ab")
9597
eq(base64.b64decode("YWJj"), "abc")
@@ -123,6 +125,7 @@ def test_b64decode_error(self):
123125
def test_b32encode(self):
124126
eq = self.assertEqual
125127
eq(base64.b32encode(''), '')
128+
eq(base64.b32encode('\x00'), 'AA======')
126129
eq(base64.b32encode('a'), 'ME======')
127130
eq(base64.b32encode('ab'), 'MFRA====')
128131
eq(base64.b32encode('abc'), 'MFRGG===')
@@ -132,6 +135,7 @@ def test_b32encode(self):
132135
def test_b32decode(self):
133136
eq = self.assertEqual
134137
eq(base64.b32decode(''), '')
138+
eq(base64.b32decode('AA======'), '\x00')
135139
eq(base64.b32decode('ME======'), 'a')
136140
eq(base64.b32decode('MFRA===='), 'ab')
137141
eq(base64.b32decode('MFRGG==='), 'abc')
@@ -166,10 +170,12 @@ def test_b32decode_error(self):
166170
def test_b16encode(self):
167171
eq = self.assertEqual
168172
eq(base64.b16encode('\x01\x02\xab\xcd\xef'), '0102ABCDEF')
173+
eq(base64.b16encode('\x00'), '00')
169174

170175
def test_b16decode(self):
171176
eq = self.assertEqual
172177
eq(base64.b16decode('0102ABCDEF'), '\x01\x02\xab\xcd\xef')
178+
eq(base64.b16decode('00'), '\x00')
173179
# Lower case is not allowed without a flag
174180
self.assertRaises(TypeError, base64.b16decode, '0102abcdef')
175181
# Case fold

0 commit comments

Comments
 (0)