Пример #1
0
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")
Пример #2
0
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()]
Пример #3
0
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()])
Пример #4
0
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')