@@ -145,16 +145,16 @@ def assertExcessPadding(data, non_strict_mode_expected_result: bytes):
145145
146146 # Test excess data exceptions
147147 assertExcessData (b'ab==a' , b'i' )
148- assertExcessData (b'ab===' , b'i' )
149- assertExcessData (b'ab====' , b'i' )
150- assertExcessData (b'ab==:' , b'i' )
148+ assertExcessPadding (b'ab===' , b'i' )
149+ assertExcessPadding (b'ab====' , b'i' )
150+ assertNonBase64Data (b'ab==:' , b'i' )
151151 assertExcessData (b'abc=a' , b'i\xb7 ' )
152- assertExcessData (b'abc=:' , b'i\xb7 ' )
153- assertExcessData (b'ab==\n ' , b'i' )
154- assertExcessData (b'abc==' , b'i\xb7 ' )
155- assertExcessData (b'abc===' , b'i\xb7 ' )
156- assertExcessData (b'abc====' , b'i\xb7 ' )
157- assertExcessData (b'abc=====' , b'i\xb7 ' )
152+ assertNonBase64Data (b'abc=:' , b'i\xb7 ' )
153+ assertNonBase64Data (b'ab==\n ' , b'i' )
154+ assertExcessPadding (b'abc==' , b'i\xb7 ' )
155+ assertExcessPadding (b'abc===' , b'i\xb7 ' )
156+ assertExcessPadding (b'abc====' , b'i\xb7 ' )
157+ assertExcessPadding (b'abc=====' , b'i\xb7 ' )
158158
159159 # Test non-base64 data exceptions
160160 assertNonBase64Data (b'\n ab==' , b'i' )
@@ -170,12 +170,45 @@ def assertExcessPadding(data, non_strict_mode_expected_result: bytes):
170170 assertLeadingPadding (b'=====' , b'' )
171171 assertDiscontinuousPadding (b'ab=c=' , b'i\xb7 ' )
172172 assertDiscontinuousPadding (b'ab=ab==' , b'i\xb6 \x9b ' )
173+ assertNonBase64Data (b'ab=:=' , b'i' )
173174 assertExcessPadding (b'abcd=' , b'i\xb7 \x1d ' )
174175 assertExcessPadding (b'abcd==' , b'i\xb7 \x1d ' )
175176 assertExcessPadding (b'abcd===' , b'i\xb7 \x1d ' )
176177 assertExcessPadding (b'abcd====' , b'i\xb7 \x1d ' )
177178 assertExcessPadding (b'abcd=====' , b'i\xb7 \x1d ' )
178179
180+ def test_base64_invalidchars (self ):
181+ def assertNonBase64Data (data , expected , ignorechars ):
182+ data = self .type2test (data )
183+ assert_regex = r'(?i)Only base64 data'
184+ self .assertEqual (binascii .a2b_base64 (data ), expected )
185+ with self .assertRaisesRegex (binascii .Error , assert_regex ):
186+ binascii .a2b_base64 (data , strict_mode = True )
187+ with self .assertRaisesRegex (binascii .Error , assert_regex ):
188+ binascii .a2b_base64 (data , ignorechars = b'' )
189+ self .assertEqual (binascii .a2b_base64 (data , ignorechars = ignorechars ),
190+ expected )
191+ self .assertEqual (binascii .a2b_base64 (data , strict_mode = False , ignorechars = b'' ),
192+ expected )
193+
194+ assertNonBase64Data (b'\n ab==' , b'i' , ignorechars = b'\n ' )
195+ assertNonBase64Data (b'ab:(){:|:&};:==' , b'i' , ignorechars = b':;(){}|&' )
196+ assertNonBase64Data (b'a\n b==' , b'i' , ignorechars = b'\n ' )
197+ assertNonBase64Data (b'a\x00 b==' , b'i' , ignorechars = b'\x00 ' )
198+ assertNonBase64Data (b'ab==:' , b'i' , ignorechars = b':' )
199+ assertNonBase64Data (b'abc=:' , b'i\xb7 ' , ignorechars = b':' )
200+ assertNonBase64Data (b'ab==\n ' , b'i' , ignorechars = b'\n ' )
201+ assertNonBase64Data (b'ab=:=' , b'i' , ignorechars = b':' )
202+
203+ data = self .type2test (b'a\n b==' )
204+ with self .assertRaises (TypeError ):
205+ binascii .a2b_base64 (data , ignorechars = bytearray ())
206+ with self .assertRaises (TypeError ):
207+ binascii .a2b_base64 (data , ignorechars = '' )
208+ with self .assertRaises (TypeError ):
209+ binascii .a2b_base64 (data , ignorechars = [])
210+ with self .assertRaises (TypeError ):
211+ binascii .a2b_base64 (data , ignorechars = None )
179212
180213 def test_base64errors (self ):
181214 # Test base64 with invalid padding
0 commit comments