Frank Denis b8c019ef49 std/base64: cleanups & support url-safe and other non-padded variants
This makes a few changes to the base64 codecs.

* The padding character is optional. The common "URL-safe" variant, in
particular, is generally not used with padding. This is also the case for
password hashes, so having this will avoid code duplication with bcrypt,
scrypt and other functions.
* The URL-safe variant is added. Instead of having individual constants
for each parameter of each variant, we are now grouping these in a
struct. So, `standard_pad_char` just becomes `standard.pad_char`.
* Types are not `snake_case`'d any more. So, `standard_encoder` becomes
`standard.Encoder`, as it is a type.
* Creating a decoder with ignored characters required the alphabet and
padding. Now, `standard.decoderWithIgnore(<ignored chars>)` returns a
decoder with the standard parameters and the set of ignored chars.
* Whatever applies to `standard.*` obviously also works with `url_safe.*`
* the `calcSize()` interface was inconsistent, taking a length in the
encoder, and a slice in the encoder. Rename the variant that takes a
slice to `calcSizeForSlice()`.
* In the decoder with ignored characters, add `calcSizeUpperBound()`,
which is more useful than the one that takes a slice in order to size
a fixed buffer before we have the data.
* Return `error.InvalidCharacter` when the input actually contains
characters that are neither padding nor part of the alphabet. If we
hit a padding issue (which includes extra bits at the end),
consistently return `error.InvalidPadding`.
* Don't keep the `char_in_alphabet` array permanently in a decoder;
it is only required for sanity checks during initialization.
* Tests are unchanged, but now cover both the standard (padded) and
the url-safe (non-padded) variants.
* Add an error set, rename `OutputTooSmallError` to `NoSpaceLeft`
to match the `hex2bin` equivalent.
2021-03-28 14:32:34 +02:00
..
2021-03-17 09:06:47 +02:00
2021-02-28 14:03:19 +01:00
2021-03-18 14:33:38 +02:00
2021-02-25 22:20:30 +02:00
2021-03-18 14:05:01 -07:00
2021-02-28 14:03:19 +01:00
2021-02-04 14:22:38 -08:00
2020-12-31 15:45:24 -08:00
2020-12-31 15:45:24 -08:00
2021-01-07 23:48:58 -08:00
2020-12-31 15:45:24 -08:00
2020-12-31 15:45:24 -08:00
2021-03-18 14:05:01 -07:00
2020-12-31 15:45:24 -08:00
2021-02-24 21:29:23 -07:00
2020-12-31 15:45:24 -08:00
2020-12-31 15:45:24 -08:00
2020-12-31 15:45:24 -08:00
2021-02-24 21:29:23 -07:00
2020-12-31 15:45:24 -08:00
2021-03-11 10:09:51 +11:00
2021-03-18 14:05:01 -07:00
2020-12-31 15:45:24 -08:00
2021-03-08 00:33:56 +02:00
2020-12-31 15:45:24 -08:00
2020-12-31 15:45:24 -08:00
2021-02-16 23:20:46 +01:00
2020-12-31 15:45:24 -08:00
2021-02-24 21:29:23 -07:00
2021-03-01 20:04:28 -07:00
2021-03-20 22:01:09 -07:00
2021-03-17 00:05:42 +02:00
2021-02-28 14:03:19 +01:00
2021-03-25 12:41:51 -07:00
2020-12-31 15:45:24 -08:00
2021-03-18 14:05:01 -07:00
2021-02-25 16:54:32 -07:00
2020-12-31 15:45:24 -08:00
2020-12-31 15:45:24 -08:00