def decode_b(encoded): defects = [] pad_err = len(encoded) % 4 if pad_err: defects.append(errors.InvalidBase64PaddingDefect()) padded_encoded = encoded + b'==='[:4 - pad_err] else: padded_encoded = encoded try: return base64.b64decode(padded_encoded, validate=True), defects except binascii.Error: # Since we had correct padding, this must an invalid char error. defects = [errors.InvalidBase64CharactersDefect()] # The non-alphabet characters are ignored as far as padding # goes, but we don't know how many there are. So we'll just # try various padding lengths until something works. for i in 0, 1, 2, 3: try: return base64.b64decode(encoded + b'=' * i, validate=False), defects except binascii.Error: if i == 0: defects.append(errors.InvalidBase64PaddingDefect()) else: # This should never happen. raise AssertionError("unexpected binascii.Error")
def decode_b(encoded): defects = [] pad_err = len(encoded) % 4 if pad_err: defects.append(errors.InvalidBase64PaddingDefect()) padded_encoded = encoded + b'==='[:4 - pad_err] else: padded_encoded = encoded try: return (base64.b64decode(padded_encoded, validate=True), defects) except binascii.Error: defects = [errors.InvalidBase64CharactersDefect()] for i in (0, 1, 2, 3): try: return (base64.b64decode(encoded + b'=' * i, validate=False), defects) except binascii.Error: if i == 0: defects.append(errors.InvalidBase64PaddingDefect()) raise AssertionError('unexpected binascii.Error')
def decode_b(encoded): # First try encoding with validate=True, fixing the padding if needed. # This will succeed only if encoded includes no invalid characters. pad_err = len(encoded) % 4 missing_padding = b'==='[:4 - pad_err] if pad_err else b'' try: return ( base64.b64decode(encoded + missing_padding, validate=True), [errors.InvalidBase64PaddingDefect()] if pad_err else [], ) except binascii.Error: # Since we had correct padding, this is likely an invalid char error. # # The non-alphabet characters are ignored as far as padding # goes, but we don't know how many there are. So try without adding # padding to see if it works. try: return ( base64.b64decode(encoded, validate=False), [errors.InvalidBase64CharactersDefect()], ) except binascii.Error: # Add as much padding as could possibly be necessary (extra padding # is ignored). try: return ( base64.b64decode(encoded + b'==', validate=False), [ errors.InvalidBase64CharactersDefect(), errors.InvalidBase64PaddingDefect() ], ) except binascii.Error: # This only happens when the encoded string's length is 1 more # than a multiple of 4, which is invalid. # # bpo-27397: Just return the encoded string since there's no # way to decode. return encoded, [errors.InvalidBase64LengthDefect()]
def decode_b(encoded): pad_err = len(encoded) % 4 missing_padding = '==='[:4 - pad_err] if pad_err else '' try: return ( base64.b64decode((encoded + missing_padding), validate=True), [errors.InvalidBase64PaddingDefect()] if pad_err else []) except binascii.Error: try: return ( base64.b64decode(encoded, validate=False), [ errors.InvalidBase64CharactersDefect()]) except binascii.Error: try: return ( base64.b64decode((encoded + '=='), validate=False), [ errors.InvalidBase64CharactersDefect(), errors.InvalidBase64PaddingDefect()]) except binascii.Error: return ( encoded, [errors.InvalidBase64LengthDefect()])