@@ -200,18 +200,6 @@ def test_b64decode(self):
200200 self .check_other_types (base64 .b64decode , b"YWJj" , b"abc" )
201201 self .check_decode_type_errors (base64 .b64decode )
202202
203- # Test with arbitrary alternative characters
204- tests_altchars = {(b'01a*b$cd' , b'*$' ): b'\xd3 V\xbe o\xf7 \x1d ' ,
205- }
206- for (data , altchars ), res in tests_altchars .items ():
207- data_str = data .decode ('ascii' )
208- altchars_str = altchars .decode ('ascii' )
209-
210- eq (base64 .b64decode (data , altchars = altchars ), res )
211- eq (base64 .b64decode (data_str , altchars = altchars ), res )
212- eq (base64 .b64decode (data , altchars = altchars_str ), res )
213- eq (base64 .b64decode (data_str , altchars = altchars_str ), res )
214-
215203 # Test standard alphabet
216204 for data , res in tests .items ():
217205 eq (base64 .standard_b64decode (data ), res )
@@ -232,6 +220,20 @@ def test_b64decode(self):
232220 b'\xd3 V\xbe o\xf7 \x1d ' )
233221 self .check_decode_type_errors (base64 .urlsafe_b64decode )
234222
223+ def test_b64decode_altchars (self ):
224+ # Test with arbitrary alternative characters
225+ eq = self .assertEqual
226+ res = b'\xd3 V\xbe o\xf7 \x1d '
227+ for altchars in b'*$' , b'+/' , b'/+' , b'+_' , b'-+' , b'-/' , b'/_' :
228+ data = b'01a%cb%ccd' % tuple (altchars )
229+ data_str = data .decode ('ascii' )
230+ altchars_str = altchars .decode ('ascii' )
231+
232+ eq (base64 .b64decode (data , altchars = altchars ), res )
233+ eq (base64 .b64decode (data_str , altchars = altchars ), res )
234+ eq (base64 .b64decode (data , altchars = altchars_str ), res )
235+ eq (base64 .b64decode (data_str , altchars = altchars_str ), res )
236+
235237 def test_b64decode_padding_error (self ):
236238 self .assertRaises (binascii .Error , base64 .b64decode , b'abc' )
237239 self .assertRaises (binascii .Error , base64 .b64decode , 'abc' )
@@ -264,9 +266,12 @@ def test_b64decode_invalid_chars(self):
264266 base64 .b64decode (bstr .decode ('ascii' ), validate = True )
265267
266268 # Normal alphabet characters not discarded when alternative given
267- res = b'\xFB \xEF \xBE \xFF \xFF \xFF '
268- self .assertEqual (base64 .b64decode (b'++[[//]]' , b'[]' ), res )
269- self .assertEqual (base64 .urlsafe_b64decode (b'++--//__' ), res )
269+ res = b'\xfb \xef \xff '
270+ self .assertEqual (base64 .b64decode (b'++//' , validate = True ), res )
271+ self .assertEqual (base64 .b64decode (b'++//' , '-_' , validate = True ), res )
272+ self .assertEqual (base64 .b64decode (b'--__' , '-_' , validate = True ), res )
273+ self .assertEqual (base64 .urlsafe_b64decode (b'++//' ), res )
274+ self .assertEqual (base64 .urlsafe_b64decode (b'--__' ), res )
270275
271276 def test_b32encode (self ):
272277 eq = self .assertEqual
@@ -321,23 +326,33 @@ def test_b32decode_casefold(self):
321326 self .assertRaises (binascii .Error , base64 .b32decode , b'me======' )
322327 self .assertRaises (binascii .Error , base64 .b32decode , 'me======' )
323328
329+ def test_b32decode_map01 (self ):
324330 # Mapping zero and one
325- eq (base64 .b32decode (b'MLO23456' ), b'b\xdd \xad \xf3 \xbe ' )
326- eq (base64 .b32decode ('MLO23456' ), b'b\xdd \xad \xf3 \xbe ' )
327-
328- map_tests = {(b'M1023456' , b'L' ): b'b\xdd \xad \xf3 \xbe ' ,
329- (b'M1023456' , b'I' ): b'b\x1d \xad \xf3 \xbe ' ,
330- }
331- for (data , map01 ), res in map_tests .items ():
332- data_str = data .decode ('ascii' )
331+ eq = self .assertEqual
332+ res_L = b'b\xdd \xad \xf3 \xbe '
333+ res_I = b'b\x1d \xad \xf3 \xbe '
334+ eq (base64 .b32decode (b'MLO23456' ), res_L )
335+ eq (base64 .b32decode ('MLO23456' ), res_L )
336+ eq (base64 .b32decode (b'MIO23456' ), res_I )
337+ eq (base64 .b32decode ('MIO23456' ), res_I )
338+ self .assertRaises (binascii .Error , base64 .b32decode , b'M1023456' )
339+ self .assertRaises (binascii .Error , base64 .b32decode , b'M1O23456' )
340+ self .assertRaises (binascii .Error , base64 .b32decode , b'ML023456' )
341+ self .assertRaises (binascii .Error , base64 .b32decode , b'MI023456' )
342+
343+ data = b'M1023456'
344+ data_str = data .decode ('ascii' )
345+ for map01 , res in [(b'L' , res_L ), (b'I' , res_I )]:
333346 map01_str = map01 .decode ('ascii' )
334347
335348 eq (base64 .b32decode (data , map01 = map01 ), res )
336349 eq (base64 .b32decode (data_str , map01 = map01 ), res )
337350 eq (base64 .b32decode (data , map01 = map01_str ), res )
338351 eq (base64 .b32decode (data_str , map01 = map01_str ), res )
339- self .assertRaises (binascii .Error , base64 .b32decode , data )
340- self .assertRaises (binascii .Error , base64 .b32decode , data_str )
352+
353+ eq (base64 .b32decode (b'M1O23456' , map01 = map01 ), res )
354+ eq (base64 .b32decode (b'M%c023456' % map01 , map01 = map01 ), res )
355+ eq (base64 .b32decode (b'M%cO23456' % map01 , map01 = map01 ), res )
341356
342357 def test_b32decode_error (self ):
343358 tests = [b'abc' , b'ABCDEF==' , b'==ABCDEF' ]
0 commit comments