> So having a “meta/relaxed decoder” usually leads to 
specification/interoperability/security problems down the road
I respectfully disagree. Since it's only relaxed with regard to decoding, 
it follows the robustness principle where you be liberal in what you accept.

Within a system, the encoding should be explicitly defined, but when that 
system has to consume base64 data from outside, being liberal actually 
avoids interoperability problems.
On Wednesday, February 3, 2021 at 1:10:32 PM UTC+8 ren...@ix.netcom.com 
wrote:

> Sorry it just doesn’t “feel right”. There are different encoding scheme as 
> laid out in the RFC. and other RFCs 
> <https://en.wikipedia.org/wiki/Base64#Variants_summary_table> that cover 
> their uses.
>
> If you have a system that states “send us Base64 data” it is poorly 
> specified - better to state, send us Base64 data according to RFC 4648 
> base64url format or according to RFC-2045.
>
> In fact, the RFC states:
>
> "This encoding may be referred to as "base64url".  This encoding
>    should not be regarded as the same as the "base64" encoding and
>    should not be referred to as only "base64".  Unless clarified
>    otherwise, "base64" refers to the base 64 in the previous section.”
>
> It also states:
>
> "If non-alphabet characters are ignored, instead of causing rejection
>    of the entire encoding (as recommended), a covert channel that can be
>    used to "leak" information is made possible."
>
> So having a “meta/relaxed decoder” usually leads to 
> specification/interoperability/security problems down the road. I realize 
> that in the “real world” you are often forced to interoperate with these 
> “bad” systems, but as most things in Go, better to be explicit and report 
> errors rather than be clever.
>
>
>
> On Feb 2, 2021, at 12:34 PM, 'Axel Wagner' via golang-nuts <
> golan...@googlegroups.com> wrote:
>
> On Tue, Feb 2, 2021 at 6:43 PM Robert Engels <ren...@ix.netcom.com> wrote:
>
>> What “padding” are you referring to? Each must be 2 characters. And there 
>> is a standard that covers this https://tools.ietf.org/html/rfc4648
>>
>
> Yes, there indeed is. Section 5 describes a second encoding scheme, used 
> for URLs and the like. Section 3.2 also talks about the padding I'm 
> referring to (it's defined elsewhere in the standard) and mentions that, in 
> certain situations, it can be omitted. In particular, you can omit padding 
> and, in the decoder, implicitly pad to a multiple of 4 bytes.
>
> I don't really understand what's the argument is here. The question was if 
> it is possible to handle all four encoding schemas 
> <https://golang.org/pkg/encoding/base64/#pkg-variables> supported by the 
> Go base64 package in one swoop, because as-is, the API requires you to pick 
> one schema and just see if it returns an error. Roger provided, IMO, a 
> pretty good answer to that: You can wrap the io.Reader in one that 
> transparently rewrites any of the four into one well-known one, which can 
> then be handled by the corresponding decoder. His link provides the code 
> for an implementation of such a reader.
>  
>
>>
>> On Feb 2, 2021, at 10:57 AM, 'Axel Wagner' via golang-nuts <
>> golan...@googlegroups.com> wrote:
>>
>> 
>> Rogers approach seems like the best one to me - wrap the input in a 
>> custom `io.Reader` that transparently replaces `-_` with `+/` respectively 
>> (and drop trailing `=`). The bufio approach doesn't work, because there is 
>> no guarantee that one of the distinguishing characters is early in the 
>> stream and the "send it to multiple decoders" approach duplicates effort 
>> and wastes resources.
>>
>> On Tue, Feb 2, 2021 at 5:43 PM Amnon <amn...@gmail.com> wrote:
>>
>>> Reading through a bufio.Reader is often useful for these situations.
>>> You can peek the beginning of the input in order to decide which decoder 
>>> to use.
>>>
>>> Another option is to use the io.TeeReader to duplicate the reader,
>>> and then send one copy to each decoder.
>>> One will succeed, and give you the output.
>>> But you will need to drain the one that fails to prevent the TeeReader 
>>> form stalling.
>>>
>>>
>>> On Tuesday, 2 February 2021 at 14:17:19 UTC axel.wa...@googlemail.com 
>>> wrote:
>>>
>>>> This question isn't about the decoded data, but about *which* base64 
>>>> format is used - i.e. if it uses padding or not and what 2 characters are 
>>>> used outside of a-zA-Z0-9. The most common ones use +/ and -_, so it's 
>>>> easy 
>>>> to tell which is used and just accept either (and padding can be viewed as 
>>>> optional during decoding anyway).
>>>>
>>>> On Tue, Feb 2, 2021 at 2:37 PM Robert Engels <ren...@ix.netcom.com> 
>>>> wrote:
>>>>
>>>>> Base64 is always ASCII. The encoded data may be in an arbitrary 
>>>>> format. You need to pass additional metadata or try and detect its 
>>>>> encoding. 
>>>>>
>>>>> On Feb 2, 2021, at 6:50 AM, roger peppe <rogp...@gmail.com> wrote:
>>>>>
>>>>> 
>>>>> In case you find it helpful, here's a clone of the base64 command that 
>>>>> I wrote in Go. I did it precisely because I wanted to be able to decode 
>>>>> any 
>>>>> encoding scheme interchangeably.
>>>>>
>>>>> https://github.com/rogpeppe/misc/blob/master/cmd/base64/base64.go
>>>>>
>>>>> I agree that it might be useful to have some of this functionality 
>>>>> available in the standard library.
>>>>>
>>>>>   cheers,
>>>>>     rog.
>>>>>
>>>>> On Tue, 2 Feb 2021 at 09:08, hey...@gmail.com <hey...@gmail.com> 
>>>>> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I have an io.Reader whose content is encoded in base64 with encoding 
>>>>>> type unknown. Since there shouldn't be any ambiguity between the two, is 
>>>>>> it 
>>>>>> possible to make the base64 automatically pick the right one to decode?
>>>>>>
>>>>>> Currently I have to read everything out to pin down the encoding, 
>>>>>> which defeats the purpose of using an io.Reader.
>>>>>>
>>>>>> Is there a solution to this problem?
>>>>>>
>>>>>> Thanks in advance.
>>>>>>
>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "golang-nuts" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to golang-nuts...@googlegroups.com.
>>>>>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/golang-nuts/0ccee37d-319e-41b3-9bfd-3dc46e0fad78n%40googlegroups.com
>>>>>>  
>>>>>> <https://groups.google.com/d/msgid/golang-nuts/0ccee37d-319e-41b3-9bfd-3dc46e0fad78n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>>
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "golang-nuts" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to golang-nuts...@googlegroups.com.
>>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/golang-nuts/CAJhgacjkUUSr-dOPFU-W4vG_AXZRY_dYYe2ti-iPuu_XUL%2BNVw%40mail.gmail.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/golang-nuts/CAJhgacjkUUSr-dOPFU-W4vG_AXZRY_dYYe2ti-iPuu_XUL%2BNVw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>>
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "golang-nuts" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to golang-nuts...@googlegroups.com.
>>>>>
>>>> To view this discussion on the web visit 
>>>>> https://groups.google.com/d/msgid/golang-nuts/CF76EF37-6F82-42FF-B4D6-4B9FC02F25FC%40ix.netcom.com
>>>>>  
>>>>> <https://groups.google.com/d/msgid/golang-nuts/CF76EF37-6F82-42FF-B4D6-4B9FC02F25FC%40ix.netcom.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to golang-nuts...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/44621cb2-fae7-4f40-9e50-35b157f4e838n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/44621cb2-fae7-4f40-9e50-35b157f4e838n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golang-nuts...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGGkOX9HzF6e178Cu6BD9Hg4x5LT7AutHkUDPvyK%2BFmYg%40mail.gmail.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGGkOX9HzF6e178Cu6BD9Hg4x5LT7AutHkUDPvyK%2BFmYg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts...@googlegroups.com.
>
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGwDKwoi4TisXPwi0-85%3D_yOqY1AOBw%3DCnH%3D7E4jhJuBg%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGwDKwoi4TisXPwi0-85%3D_yOqY1AOBw%3DCnH%3D7E4jhJuBg%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/5963b370-e82f-4f50-9d3a-037f3899b5e8n%40googlegroups.com.

Reply via email to