11 KiB
11 KiB
0.22.1
- Correct the symbols used for the predefined
alphabet::BIN_HEX.
0.22.0
DecodeSliceError::OutputSliceTooSmallis now conservative rather than precise. That is, the error will only occur if the decoded output cannot fit, meaning thatEngine::decode_slicecan now be used with exactly-sized output slices. As part of this,Engine::internal_decodenow returnsDecodeSliceErrorinstead ofDecodeError, but that is not expected to affect any external callers.DecodeError::InvalidLengthnow refers specifically to the number of valid symbols being invalid (i.e.len % 4 == 1), rather than just the number of input bytes. This avoids confusing scenarios when based on interpretation you could make a case for eitherInvalidLengthorInvalidBytebeing appropriate.- Decoding is somewhat faster (5-10%)
0.21.7
- Support getting an alphabet's contents as a str via
Alphabet::as_str()
0.21.6
- Improved introductory documentation and example
0.21.5
- Add
DebugandCloneimpls for the general purpose Engine
0.21.4
- Make
encoded_lenconst, allowing the creation of arrays sized to encode compile-time-known data lengths
0.21.3
- Implement
sourceinstead ofcauseon Error types - Roll back MSRV to 1.48.0 so Debian can continue to live in a time warp
- Slightly faster chunked encoding for short inputs
- Decrease binary size
0.21.2
- Rollback MSRV to 1.57.0 -- only dev dependencies need 1.60, not the main code
0.21.1
- Remove the possibility of panicking during decoded length calculations
DecoderReaderno longer sometimes erroneously ignores padding #226
Breaking changes
Engine.internal_decodereturn type changed- Update MSRV to 1.60.0
0.21.0
Migration
Functions
| < 0.20 function | 0.21 equivalent |
|---|---|
encode() |
engine::general_purpose::STANDARD.encode() or prelude::BASE64_STANDARD.encode() |
encode_config() |
engine.encode() |
encode_config_buf() |
engine.encode_string() |
encode_config_slice() |
engine.encode_slice() |
decode() |
engine::general_purpose::STANDARD.decode() or prelude::BASE64_STANDARD.decode() |
decode_config() |
engine.decode() |
decode_config_buf() |
engine.decode_vec() |
decode_config_slice() |
engine.decode_slice() |
The short-lived 0.20 functions were the 0.13 functions with config replaced with engine.
Padding
If applicable, use the preset engines engine::STANDARD, engine::STANDARD_NO_PAD, engine::URL_SAFE,
or engine::URL_SAFE_NO_PAD.
The NO_PAD ones require that padding is absent when decoding, and the others require that
canonical padding is present .
If you need the < 0.20 behavior that did not care about padding, or want to recreate < 0.20.0's predefined Configs
precisely, see the following table.
| 0.13.1 Config | 0.20.0+ alphabet | encode_padding |
decode_padding_mode |
|---|---|---|---|
| STANDARD | STANDARD | true | Indifferent |
| STANDARD_NO_PAD | STANDARD | false | Indifferent |
| URL_SAFE | URL_SAFE | true | Indifferent |
| URL_SAFE_NO_PAD | URL_SAFE | false | Indifferent |
0.21.0-rc.1
- Restore the ability to decode into a slice of precisely the correct length with
Engine.decode_slice_unchecked. - Add
Engineas apub useinprelude.
0.21.0-beta.2
Breaking changes
- Re-exports of preconfigured engines in
engineare removed in favor ofbase64::prelude::...that are better suited to those who wish tousethe entire path to a name.
0.21.0-beta.1
Breaking changes
FastPortablewas only meant to be an interim name, and shouldn't have shipped in 0.20. It is nowGeneralPurposeto make its intended usage more clear.GeneralPurposeand its config are nowpub use'd in theenginemodule for convenience.- Change a few
from()functions to benew().from()causes confusing compiler errors because of confusion withFrom::from, and is a little misleading because some of those invocations are not very cheap as one would usually expect from afromcall. encode*anddecode*top level functions are now methods onEngine.DEFAULT_ENGINEwas replaced byengine::general_purpose::STANDARD- Predefined engine consts
engine::general_purpose::{STANDARD, STANDARD_NO_PAD, URL_SAFE, URL_SAFE_NO_PAD}- These are
pub used intoengineas well
- These are
- The
*_slicedecode/encode functions now return an error instead of panicking when the output slice is too small- As part of this, there isn't now a public way to decode into a slice exactly the size needed for inputs that aren't multiples of 4 tokens. If adding up to 2 bytes to always be a multiple of 3 bytes for the decode buffer is a problem, file an issue.
Other changes
decoded_len_estimate()is provided to make it easy to size decode buffers correctly.
0.20.0
Breaking changes
- Update MSRV to 1.57.0
- Decoding can now either ignore padding, require correct padding, or require no padding. The default is to require
correct padding.
- The
NO_PADconfig now requires that padding be absent when decoding.
- The
0.20.0-alpha.1
Breaking changes
- Extended the
Configconcept into theEngineabstraction, allowing the user to pick different encoding / decoding implementations.- What was formerly the only algorithm is now the
FastPortableengine, so named because it's portable (works on any CPU) and relatively fast. - This opens the door to a portable constant-time
implementation (#153,
presumably
ConstantTimePortable?) for security-sensitive applications that need side-channel resistance, and CPU-specific SIMD implementations for more speed. - Standard base64 per the RFC is available via
DEFAULT_ENGINE. To use different alphabets or other settings ( padding, etc), create your own engine instance.
- What was formerly the only algorithm is now the
CharacterSetis nowAlphabet(per the RFC), and allows creating custom alphabets. The corresponding tables that were previously code-generated are now built dynamically.- Since there are already multiple breaking changes, various functions are renamed to be more consistent and discoverable.
- MSRV is now 1.47.0 to allow various things to use
const fn. DecoderReadernow owns its inner reader, and can expose it viainto_inner(). For symmetry,EncoderWritercan do the same with its writer.encoded_lenis now public so you can size encode buffers precisely.
0.13.1
- More precise decode buffer sizing, avoiding unnecessary allocation in
decode_config.
0.13.0
- Config methods are const
- Added
EncoderStringWriterto allow encoding directly to a String EncoderWriternow owns its delegate writer rather than keeping a reference to it (though refs still work)- As a consequence, it is now possible to extract the delegate writer from an
EncoderWriterviafinish(), which returnsResult<W>instead ofResult<()>. If you were callingfinish()explicitly, you will now need to uselet _ = foo.finish()instead of justfoo.finish()to avoid a warning about the unused value.
- As a consequence, it is now possible to extract the delegate writer from an
- When decoding input that has both an invalid length and an invalid symbol as the last byte,
InvalidBytewill be emitted instead ofInvalidLengthto make the problem more obvious.
0.12.2
- Add
BinHexalphabet
0.12.1
- Add
Bcryptalphabet
0.12.0
- A
Readimplementation (DecoderReader) to let users transparently decoded data from a b64 input source - IMAP's modified b64 alphabet
- Relaxed type restrictions to just
AsRef<[ut8]>for mainencode*/decode*functions - A minor performance improvement in encoding
0.11.0
- Minimum rust version 1.34.0
no_stdis now supported via the two new featuresallocandstd.
0.10.1
- Minimum rust version 1.27.2
- Fix bug in streaming encoding (#90): if the underlying writer
didn't write all the bytes given to it, the remaining bytes would not be retried later. See the docs
on
EncoderWriter::write. - Make it configurable whether or not to return an error when decoding detects excess trailing bits.
0.10.0
- Remove line wrapping. Line wrapping was never a great conceptual fit in this library, and other features (streaming
encoding, etc) either couldn't support it or could support only special cases of it with a great increase in
complexity. Line wrapping has been pulled out into a line-wrap crate, so it's
still available if you need it.
Base64Displaycreation no longer uses aResultbecause it can't fail, which means its helper methods for common configs thatunwrap()for you are no longer needed
- Add a streaming encoder
Writeimpl to transparently base64 as you write. - Remove the remaining
unsafecode. - Remove whitespace stripping to simplify
no_stdsupport. No out of the box configs use it, and it's trivial to do yourself if needed:filter(|b| !b" \n\t\r\x0b\x0c".contains(b). - Detect invalid trailing symbols when decoding and return an error rather than silently ignoring them.
0.9.3
- Update safemem
0.9.2
- Derive
CloneforDecodeError.
0.9.1
- Add support for
crypt(3)'s base64 variant.
0.9.0
decode_config_slicefunction for no-allocation decoding, analogous toencode_config_slice- Decode performance optimization
0.8.0
encode_config_slicefunction for no-allocation encoding
0.7.0
STANDARD_NO_PADconfigBase64Displayheap-free wrapper for use in format strings, etc
0.6.0
- Decode performance improvements
- Use
unsafein fewer places - Added fuzzers
0.5.2
- Avoid usize overflow when calculating length
- Better line wrapping performance
0.5.1
- Temporarily disable line wrapping
- Add Apache 2.0 license
0.5.0
- MIME support, including configurable line endings and line wrapping
- Removed
decode_ws - Renamed
Base64ErrortoDecodeError
0.4.1
- Allow decoding a
AsRef<[u8]>instead of just a&str
0.4.0
- Configurable padding
- Encode performance improvements
0.3.0
- Added encode/decode functions that do not allocate their own storage
- Decode performance improvements
- Extraneous padding bytes are no longer ignored. Now, an error will be returned.