0.2.0 |
|
---|---|
0.1.0 |
|
#5 in #phc
20KB
243 lines
RustCrypto: B64 encoding
Pure Rust implementation of B64, a subset of the standard Base64 encoding (RFC 4648) used by the PHC string format.
Implemented without data-dependent branches or look up tables, thereby providing "best effort" constant-time operation.
Supports no_std
environments and avoids heap allocations in the core API
(but also provides optional alloc
support for convenience).
About B64
The following description of B64 is quoted from the PHC string format spec:
The B64 encoding is the standard Base64 encoding (RFC 4648, section 4) except that the padding
=
signs are omitted, and extra characters (whitespace) are not allowed:
Input is split into successive groups of bytes. Each group, except possibly the last one, contains exactly three bytes.
For a group of bytes b0, b1 and b2, compute the following value:
x = (b0 << 16) + (b1 << 8) + b2
Then split
x
into four 6-bit valuesy0
,y1
,y2
andy3
such that:x = (y0 << 18) + (y1 << 12) + (y2 << 6) + y3
Each 6-bit value is encoded into a character in the
[A-Za-z0-9+/]
alphabet, in that order:
A
..Z
= 0 to 25a
..z
= 26 to 510
..9
= 52 to 61+
= 62/
= 63If the last group does not contain exactly three bytes, then:
- The group is completed with one or two bytes of value 0x00, then processed as above.
- The resulting sequence of characters is truncated to its first two characters (if the group initially contained a single byte) or to its first three characters (if the group initially contained two bytes).
A B64-encoded value thus yields a string whose length, taken modulo 4, can be equal to 0, 2 or 3, but not to 1. Take note that a sequence of characters of the right length may still be an invalid encoding if it defines some non-zero trailing bits in the last incomplete group; producers MUST set the trailing bits to 0, while consumers MAY ignore them, or MAY reject such invalid encodings.
License
Licensed under either of:
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.