@@ -208,18 +208,6 @@ def test_b64decode(self):
208208 self .check_other_types (base64 .b64decode , b"YWJj" , b"abc" )
209209 self .check_decode_type_errors (base64 .b64decode )
210210
211- # Test with arbitrary alternative characters
212- tests_altchars = {(b'01a*b$cd' , b'*$' ): b'\xd3 V\xbe o\xf7 \x1d ' ,
213- }
214- for (data , altchars ), res in tests_altchars .items ():
215- data_str = data .decode ('ascii' )
216- altchars_str = altchars .decode ('ascii' )
217-
218- eq (base64 .b64decode (data , altchars = altchars ), res )
219- eq (base64 .b64decode (data_str , altchars = altchars ), res )
220- eq (base64 .b64decode (data , altchars = altchars_str ), res )
221- eq (base64 .b64decode (data_str , altchars = altchars_str ), res )
222-
223211 # Test standard alphabet
224212 for data , res in tests .items ():
225213 eq (base64 .standard_b64decode (data ), res )
@@ -240,6 +228,20 @@ def test_b64decode(self):
240228 b'\xd3 V\xbe o\xf7 \x1d ' )
241229 self .check_decode_type_errors (base64 .urlsafe_b64decode )
242230
231+ def test_b64decode_altchars (self ):
232+ # Test with arbitrary alternative characters
233+ eq = self .assertEqual
234+ res = b'\xd3 V\xbe o\xf7 \x1d '
235+ for altchars in b'*$' , b'+/' , b'/+' , b'+_' , b'-+' , b'-/' , b'/_' :
236+ data = b'01a%cb%ccd' % tuple (altchars )
237+ data_str = data .decode ('ascii' )
238+ altchars_str = altchars .decode ('ascii' )
239+
240+ eq (base64 .b64decode (data , altchars = altchars ), res )
241+ eq (base64 .b64decode (data_str , altchars = altchars ), res )
242+ eq (base64 .b64decode (data , altchars = altchars_str ), res )
243+ eq (base64 .b64decode (data_str , altchars = altchars_str ), res )
244+
243245 def test_b64decode_padding_error (self ):
244246 self .assertRaises (binascii .Error , base64 .b64decode , b'abc' )
245247 self .assertRaises (binascii .Error , base64 .b64decode , 'abc' )
@@ -272,9 +274,12 @@ def test_b64decode_invalid_chars(self):
272274 base64 .b64decode (bstr .decode ('ascii' ), validate = True )
273275
274276 # Normal alphabet characters not discarded when alternative given
275- res = b'\xFB \xEF \xBE \xFF \xFF \xFF '
276- self .assertEqual (base64 .b64decode (b'++[[//]]' , b'[]' ), res )
277- self .assertEqual (base64 .urlsafe_b64decode (b'++--//__' ), res )
277+ res = b'\xfb \xef \xff '
278+ self .assertEqual (base64 .b64decode (b'++//' , validate = True ), res )
279+ self .assertEqual (base64 .b64decode (b'++//' , '-_' , validate = True ), res )
280+ self .assertEqual (base64 .b64decode (b'--__' , '-_' , validate = True ), res )
281+ self .assertEqual (base64 .urlsafe_b64decode (b'++//' ), res )
282+ self .assertEqual (base64 .urlsafe_b64decode (b'--__' ), res )
278283
279284 def test_b32encode (self ):
280285 eq = self .assertEqual
@@ -329,23 +334,33 @@ def test_b32decode_casefold(self):
329334 self .assertRaises (binascii .Error , base64 .b32decode , b'me======' )
330335 self .assertRaises (binascii .Error , base64 .b32decode , 'me======' )
331336
337+ def test_b32decode_map01 (self ):
332338 # Mapping zero and one
333- eq (base64 .b32decode (b'MLO23456' ), b'b\xdd \xad \xf3 \xbe ' )
334- eq (base64 .b32decode ('MLO23456' ), b'b\xdd \xad \xf3 \xbe ' )
335-
336- map_tests = {(b'M1023456' , b'L' ): b'b\xdd \xad \xf3 \xbe ' ,
337- (b'M1023456' , b'I' ): b'b\x1d \xad \xf3 \xbe ' ,
338- }
339- for (data , map01 ), res in map_tests .items ():
340- data_str = data .decode ('ascii' )
339+ eq = self .assertEqual
340+ res_L = b'b\xdd \xad \xf3 \xbe '
341+ res_I = b'b\x1d \xad \xf3 \xbe '
342+ eq (base64 .b32decode (b'MLO23456' ), res_L )
343+ eq (base64 .b32decode ('MLO23456' ), res_L )
344+ eq (base64 .b32decode (b'MIO23456' ), res_I )
345+ eq (base64 .b32decode ('MIO23456' ), res_I )
346+ self .assertRaises (binascii .Error , base64 .b32decode , b'M1023456' )
347+ self .assertRaises (binascii .Error , base64 .b32decode , b'M1O23456' )
348+ self .assertRaises (binascii .Error , base64 .b32decode , b'ML023456' )
349+ self .assertRaises (binascii .Error , base64 .b32decode , b'MI023456' )
350+
351+ data = b'M1023456'
352+ data_str = data .decode ('ascii' )
353+ for map01 , res in [(b'L' , res_L ), (b'I' , res_I )]:
341354 map01_str = map01 .decode ('ascii' )
342355
343356 eq (base64 .b32decode (data , map01 = map01 ), res )
344357 eq (base64 .b32decode (data_str , map01 = map01 ), res )
345358 eq (base64 .b32decode (data , map01 = map01_str ), res )
346359 eq (base64 .b32decode (data_str , map01 = map01_str ), res )
347- self .assertRaises (binascii .Error , base64 .b32decode , data )
348- self .assertRaises (binascii .Error , base64 .b32decode , data_str )
360+
361+ eq (base64 .b32decode (b'M1O23456' , map01 = map01 ), res )
362+ eq (base64 .b32decode (b'M%c023456' % map01 , map01 = map01 ), res )
363+ eq (base64 .b32decode (b'M%cO23456' % map01 , map01 = map01 ), res )
349364
350365 def test_b32decode_error (self ):
351366 tests = [b'abc' , b'ABCDEF==' , b'==ABCDEF' ]
0 commit comments