Possible bug in base64.decode: linebreaks are not ignored
Hello, I've tried reading various RFCs around Base64 encoding, but I couldn't make the ends meet. Yet there is an inconsistency between base64.decodebytes() and base64.decode() in that how they handle linebreaks that were used to collate the encoded text. Below is an example of what I'm talking about:
import base64 foo = base64.encodebytes(b'123456789') foo b'MTIzNDU2Nzg5\n' foo = b'MTIzND\n' + b'U2Nzg5\n' foo b'MTIzND\nU2Nzg5\n' base64.decodebytes(foo) b'123456789' from io import BytesIO bytes_in = BytesIO(foo) bytes_out = BytesIO() bytes_in.seek(0) 0 base64.decode(bytes_in, bytes_out) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/somewhere/lib/python3.6/base64.py", line 512, in decode s = binascii.a2b_base64(line) binascii.Error: Incorrect padding bytes_in = BytesIO(base64.encodebytes(b'123456789')) bytes_in.seek(0) 0 base64.decode(bytes_in, bytes_out) bytes_out.getvalue() b'123456789'
Obviously, I'd expect encodebytes() and encode both to either accept or to reject the same input. Thanks. Oleg PS. I couldn't register to the bug-tracker (never received an email confirmation, not even in a spam folder), this is why I'm sending it here. This communication and all information contained in or attached to it is confidential, intended solely for the addressee, may be legally privileged and is the intellectual property of one of the companies of NEX Group plc ("NEX") or third parties. If you are not the intended addressee or receive this message in error, please immediately delete all copies of it and notify the sender. We have taken precautions to minimise the risk of transmitting software viruses, but we advise you to carry out your own virus checks on any attachments. We do not accept liability for any loss or damage caused by software viruses. NEX reserves the right to monitor all communications. We do not accept any legal responsibility for the content of communications, and no communication shall be considered legally binding. Furthermore, if the content of this communication is personal or unconnected with our business, we accept no liability or responsibility for it. NEX Group plc is a public limited company registered in England and Wales under number 10013770 and certain of its affiliates are authorised and regulated by regulatory authorities. For further regulatory information please see www.NEX.com.
I opened https://bugs.python.org/issue32491 so this wouldn't be lost under the assumption that you'll eventually resolve your bugtracker account situation. :) I don't know what the correct behavior *should* be but agree that it seems odd for decode to behave different than decodebytes. -gps On Wed, Jan 3, 2018 at 8:00 AM Oleg Sivokon <olegs@traiana.com> wrote:
Hello,
I've tried reading various RFCs around Base64 encoding, but I couldn't make the ends meet. Yet there is an inconsistency between base64.decodebytes() and base64.decode() in that how they handle linebreaks that were used to collate the encoded text. Below is an example of what I'm talking about:
import base64 foo = base64.encodebytes(b'123456789') foo b'MTIzNDU2Nzg5\n' foo = b'MTIzND\n' + b'U2Nzg5\n' foo b'MTIzND\nU2Nzg5\n' base64.decodebytes(foo) b'123456789' from io import BytesIO bytes_in = BytesIO(foo) bytes_out = BytesIO() bytes_in.seek(0) 0 base64.decode(bytes_in, bytes_out) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/somewhere/lib/python3.6/base64.py", line 512, in decode s = binascii.a2b_base64(line) binascii.Error: Incorrect padding bytes_in = BytesIO(base64.encodebytes(b'123456789')) bytes_in.seek(0) 0 base64.decode(bytes_in, bytes_out) bytes_out.getvalue() b'123456789'
Obviously, I'd expect encodebytes() and encode both to either accept or to reject the same input.
Thanks.
Oleg
PS. I couldn't register to the bug-tracker (never received an email confirmation, not even in a spam folder), this is why I'm sending it here. This communication and all information contained in or attached to it is confidential, intended solely for the addressee, may be legally privileged and is the intellectual property of one of the companies of NEX Group plc ("NEX") or third parties. If you are not the intended addressee or receive this message in error, please immediately delete all copies of it and notify the sender. We have taken precautions to minimise the risk of transmitting software viruses, but we advise you to carry out your own virus checks on any attachments. We do not accept liability for any loss or damage caused by software viruses. NEX reserves the right to monitor all communications. We do not accept any legal responsibility for the content of communications, and no communication shall be considered legally binding. Furthermore, if the content of this communication is personal or unconnected with our business, we accept no liability or responsibility for it. NEX Group plc is a public limited company regi stered in England and Wales under number 10013770 and certain of its affiliates are authorised and regulated by regulatory authorities. For further regulatory information please see www.NEX.com. _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/greg%40krypto.org
participants (2)
-
Gregory P. Smith
-
Oleg Sivokon