@@ -231,18 +231,6 @@ def test_b64decode(self):
231231 self .check_other_types (base64 .b64decode , b"YWJj" , b"abc" )
232232 self .check_decode_type_errors (base64 .b64decode )
233233
234- # Test with arbitrary alternative characters
235- tests_altchars = {(b'01a*b$cd' , b'*$' ): b'\xd3 V\xbe o\xf7 \x1d ' ,
236- }
237- for (data , altchars ), res in tests_altchars .items ():
238- data_str = data .decode ('ascii' )
239- altchars_str = altchars .decode ('ascii' )
240-
241- eq (base64 .b64decode (data , altchars = altchars ), res )
242- eq (base64 .b64decode (data_str , altchars = altchars ), res )
243- eq (base64 .b64decode (data , altchars = altchars_str ), res )
244- eq (base64 .b64decode (data_str , altchars = altchars_str ), res )
245-
246234 # Test standard alphabet
247235 for data , res in tests .items ():
248236 eq (base64 .standard_b64decode (data ), res )
@@ -263,6 +251,20 @@ def test_b64decode(self):
263251 b'\xd3 V\xbe o\xf7 \x1d ' )
264252 self .check_decode_type_errors (base64 .urlsafe_b64decode )
265253
254+ def test_b64decode_altchars (self ):
255+ # Test with arbitrary alternative characters
256+ eq = self .assertEqual
257+ res = b'\xd3 V\xbe o\xf7 \x1d '
258+ for altchars in b'*$' , b'+/' , b'/+' , b'+_' , b'-+' , b'-/' , b'/_' :
259+ data = b'01a%cb%ccd' % tuple (altchars )
260+ data_str = data .decode ('ascii' )
261+ altchars_str = altchars .decode ('ascii' )
262+
263+ eq (base64 .b64decode (data , altchars = altchars ), res )
264+ eq (base64 .b64decode (data_str , altchars = altchars ), res )
265+ eq (base64 .b64decode (data , altchars = altchars_str ), res )
266+ eq (base64 .b64decode (data_str , altchars = altchars_str ), res )
267+
266268 def test_b64decode_padding_error (self ):
267269 self .assertRaises (binascii .Error , base64 .b64decode , b'abc' )
268270 self .assertRaises (binascii .Error , base64 .b64decode , 'abc' )
@@ -295,10 +297,12 @@ def test_b64decode_invalid_chars(self):
295297 base64 .b64decode (bstr .decode ('ascii' ), validate = True )
296298
297299 # Normal alphabet characters not discarded when alternative given
298- res = b'\xFB \xEF \xBE \xFF \xFF \xFF '
299- self .assertEqual (base64 .b64decode (b'++[[//]]' , b'[]' ), res )
300- self .assertEqual (base64 .urlsafe_b64decode (b'++--//__' ), res )
301-
300+ res = b'\xfb \xef \xff '
301+ self .assertEqual (base64 .b64decode (b'++//' , validate = True ), res )
302+ self .assertEqual (base64 .b64decode (b'++//' , '-_' , validate = True ), res )
303+ self .assertEqual (base64 .b64decode (b'--__' , '-_' , validate = True ), res )
304+ self .assertEqual (base64 .urlsafe_b64decode (b'++//' ), res )
305+ self .assertEqual (base64 .urlsafe_b64decode (b'--__' ), res )
302306
303307 def _altchars_strategy ():
304308 """Generate 'altchars' for base64 encoding."""
@@ -394,19 +398,33 @@ def test_b32decode_casefold(self):
394398 eq (base64 .b32decode (b'MLO23456' ), b'b\xdd \xad \xf3 \xbe ' )
395399 eq (base64 .b32decode ('MLO23456' ), b'b\xdd \xad \xf3 \xbe ' )
396400
397- map_tests = {(b'M1023456' , b'L' ): b'b\xdd \xad \xf3 \xbe ' ,
398- (b'M1023456' , b'I' ): b'b\x1d \xad \xf3 \xbe ' ,
399- }
400- for (data , map01 ), res in map_tests .items ():
401- data_str = data .decode ('ascii' )
401+ def test_b32decode_map01 (self ):
402+ # Mapping zero and one
403+ eq = self .assertEqual
404+ res_L = b'b\xdd \xad \xf3 \xbe '
405+ res_I = b'b\x1d \xad \xf3 \xbe '
406+ eq (base64 .b32decode (b'MLO23456' ), res_L )
407+ eq (base64 .b32decode ('MLO23456' ), res_L )
408+ eq (base64 .b32decode (b'MIO23456' ), res_I )
409+ eq (base64 .b32decode ('MIO23456' ), res_I )
410+ self .assertRaises (binascii .Error , base64 .b32decode , b'M1023456' )
411+ self .assertRaises (binascii .Error , base64 .b32decode , b'M1O23456' )
412+ self .assertRaises (binascii .Error , base64 .b32decode , b'ML023456' )
413+ self .assertRaises (binascii .Error , base64 .b32decode , b'MI023456' )
414+
415+ data = b'M1023456'
416+ data_str = data .decode ('ascii' )
417+ for map01 , res in [(b'L' , res_L ), (b'I' , res_I )]:
402418 map01_str = map01 .decode ('ascii' )
403419
404420 eq (base64 .b32decode (data , map01 = map01 ), res )
405421 eq (base64 .b32decode (data_str , map01 = map01 ), res )
406422 eq (base64 .b32decode (data , map01 = map01_str ), res )
407423 eq (base64 .b32decode (data_str , map01 = map01_str ), res )
408- self .assertRaises (binascii .Error , base64 .b32decode , data )
409- self .assertRaises (binascii .Error , base64 .b32decode , data_str )
424+
425+ eq (base64 .b32decode (b'M1O23456' , map01 = map01 ), res )
426+ eq (base64 .b32decode (b'M%c023456' % map01 , map01 = map01 ), res )
427+ eq (base64 .b32decode (b'M%cO23456' % map01 , map01 = map01 ), res )
410428
411429 def test_b32decode_error (self ):
412430 tests = [b'abc' , b'ABCDEF==' , b'==ABCDEF' ]
0 commit comments