1 //! Efficient and customizable data-encoding functions like base64, base32, and hex
2 //!
3 //! This [crate] provides little-endian ASCII base-conversion encodings for
4 //! bases of size 2, 4, 8, 16, 32, and 64. It supports:
5 //!
6 //! - [padding] for streaming
7 //! - canonical encodings (e.g. [trailing bits] are checked)
8 //! - in-place [encoding] and [decoding] functions
9 //! - partial [decoding] functions (e.g. for error recovery)
10 //! - character [translation] (e.g. for case-insensitivity)
11 //! - most and least significant [bit-order]
12 //! - [ignoring] characters when decoding (e.g. for skipping newlines)
13 //! - [wrapping] the output when encoding
14 //! - no-std environments with `default-features = false, features = ["alloc"]`
15 //! - no-alloc environments with `default-features = false`
16 //!
17 //! You may use the [binary] or the [website] to play around.
18 //!
19 //! # Examples
20 //!
21 //! This crate provides predefined encodings as [constants]. These constants are of type
22 //! [`Encoding`]. This type provides encoding and decoding functions with in-place or allocating
23 //! variants. Here is an example using the allocating encoding function of [`BASE64`]:
24 //!
25 //! ```rust
26 //! use data_encoding::BASE64;
27 //! assert_eq!(BASE64.encode(b"Hello world"), "SGVsbG8gd29ybGQ=");
28 //! ```
29 //!
30 //! Here is an example using the in-place decoding function of [`BASE32`]:
31 //!
32 //! ```rust
33 //! use data_encoding::BASE32;
34 //! let input = b"JBSWY3DPEB3W64TMMQ======";
35 //! let mut output = vec![0; BASE32.decode_len(input.len()).unwrap()];
36 //! let len = BASE32.decode_mut(input, &mut output).unwrap();
37 //! assert_eq!(&output[0 .. len], b"Hello world");
38 //! ```
39 //!
40 //! You are not limited to the predefined encodings. You may define your own encodings (with the
41 //! same correctness and performance properties as the predefined ones) using the [`Specification`]
42 //! type:
43 //!
44 //! ```rust
45 //! use data_encoding::Specification;
46 //! let hex = {
47 //! let mut spec = Specification::new();
48 //! spec.symbols.push_str("0123456789abcdef");
49 //! spec.encoding().unwrap()
50 //! };
51 //! assert_eq!(hex.encode(b"hello"), "68656c6c6f");
52 //! ```
53 //!
54 //! You may use the [macro] library to define a compile-time custom encoding:
55 //!
56 //! ```rust,ignore
57 //! use data_encoding::Encoding;
58 //! use data_encoding_macro::new_encoding;
59 //! const HEX: Encoding = new_encoding!{
60 //! symbols: "0123456789abcdef",
61 //! translate_from: "ABCDEF",
62 //! translate_to: "abcdef",
63 //! };
64 //! const BASE64: Encoding = new_encoding!{
65 //! symbols: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
66 //! padding: '=',
67 //! };
68 //! ```
69 //!
70 //! # Properties
71 //!
72 //! The [`HEXUPPER`], [`BASE32`], [`BASE32HEX`], [`BASE64`], and [`BASE64URL`] predefined encodings
73 //! conform to [RFC4648].
74 //!
75 //! In general, the encoding and decoding functions satisfy the following properties:
76 //!
77 //! - They are deterministic: their output only depends on their input
78 //! - They have no side-effects: they do not modify any hidden mutable state
79 //! - They are correct: encoding followed by decoding gives the initial data
80 //! - They are canonical (unless [`is_canonical`] returns false): decoding followed by encoding
81 //! gives the initial data
82 //!
83 //! This last property is usually not satisfied by base64 implementations. This is a matter of
84 //! choice and this crate has made the choice to let the user choose. Support for canonical encoding
85 //! as described by the [RFC][canonical] is provided. But it is also possible to disable checking
86 //! trailing bits, to add characters translation, to decode concatenated padded inputs, and to
87 //! ignore some characters. Note that non-canonical encodings may be an attack vector as described
88 //! in [Base64 Malleability in Practice](https://eprint.iacr.org/2022/361.pdf).
89 //!
90 //! Since the RFC specifies the encoding function on all inputs and the decoding function on all
91 //! possible encoded outputs, the differences between implementations come from the decoding
92 //! function which may be more or less permissive. In this crate, the decoding function of canonical
93 //! encodings rejects all inputs that are not a possible output of the encoding function. Here are
94 //! some concrete examples of decoding differences between this crate, the `base64` crate, and the
95 //! `base64` GNU program:
96 //!
97 //! | Input | `data-encoding` | `base64` | GNU `base64` |
98 //! | ---------- | --------------- | --------- | ------------- |
99 //! | `AAB=` | `Trailing(2)` | `Last(2)` | `\x00\x00` |
100 //! | `AA\nB=` | `Length(4)` | `Byte(2)` | `\x00\x00` |
101 //! | `AAB` | `Length(0)` | `Padding` | Invalid input |
102 //! | `AAA` | `Length(0)` | `Padding` | Invalid input |
103 //! | `A\rA\nB=` | `Length(4)` | `Byte(1)` | Invalid input |
104 //! | `-_\r\n` | `Symbol(0)` | `Byte(0)` | Invalid input |
105 //! | `AA==AA==` | `[0, 0]` | `Byte(2)` | `\x00\x00` |
106 //!
107 //! We can summarize these discrepancies as follows:
108 //!
109 //! | Discrepancy | `data-encoding` | `base64` | GNU `base64` |
110 //! | -------------------------- | --------------- | -------- | ------------ |
111 //! | Check trailing bits | Yes | Yes | No |
112 //! | Ignored characters | None | None | `\n` |
113 //! | Translated characters | None | None | None |
114 //! | Check padding | Yes | No | Yes |
115 //! | Support concatenated input | Yes | No | Yes |
116 //!
117 //! This crate permits to disable checking trailing bits. It permits to ignore some characters. It
118 //! permits to translate characters. It permits to use unpadded encodings. However, for padded
119 //! encodings, support for concatenated inputs cannot be disabled. This is simply because it doesn't
120 //! make sense to use padding if it is not to support concatenated inputs.
121 //!
122 //! [RFC4648]: https://tools.ietf.org/html/rfc4648
123 //! [`BASE32HEX`]: constant.BASE32HEX.html
124 //! [`BASE32`]: constant.BASE32.html
125 //! [`BASE64URL`]: constant.BASE64URL.html
126 //! [`BASE64`]: constant.BASE64.html
127 //! [`Encoding`]: struct.Encoding.html
128 //! [`HEXUPPER`]: constant.HEXUPPER.html
129 //! [`Specification`]: struct.Specification.html
130 //! [`is_canonical`]: struct.Encoding.html#method.is_canonical
131 //! [binary]: https://crates.io/crates/data-encoding-bin
132 //! [bit-order]: struct.Specification.html#structfield.bit_order
133 //! [canonical]: https://tools.ietf.org/html/rfc4648#section-3.5
134 //! [constants]: index.html#constants
135 //! [crate]: https://crates.io/crates/data-encoding
136 //! [decoding]: struct.Encoding.html#method.decode_mut
137 //! [encoding]: struct.Encoding.html#method.encode_mut
138 //! [ignoring]: struct.Specification.html#structfield.ignore
139 //! [macro]: https://crates.io/crates/data-encoding-macro
140 //! [padding]: struct.Specification.html#structfield.padding
141 //! [trailing bits]: struct.Specification.html#structfield.check_trailing_bits
142 //! [translation]: struct.Specification.html#structfield.translate
143 //! [website]: https://data-encoding.rs
144 //! [wrapping]: struct.Specification.html#structfield.wrap
145
146 #![no_std]
147 #![cfg_attr(docsrs, feature(doc_auto_cfg))]
148
149 #[cfg(feature = "alloc")]
150 extern crate alloc;
151 #[cfg(feature = "std")]
152 extern crate std;
153
154 #[cfg(feature = "alloc")]
155 use alloc::borrow::{Cow, ToOwned};
156 #[cfg(feature = "alloc")]
157 use alloc::string::String;
158 #[cfg(feature = "alloc")]
159 use alloc::vec;
160 #[cfg(feature = "alloc")]
161 use alloc::vec::Vec;
162 use core::convert::TryInto;
163 use core::debug_assert as safety_assert;
164
165 macro_rules! check {
166 ($e: expr, $c: expr) => {
167 if !$c {
168 return Err($e);
169 }
170 };
171 }
172
173 trait Static<T: Copy>: Copy {
val(self) -> T174 fn val(self) -> T;
175 }
176
177 macro_rules! define {
178 ($name: ident: $type: ty = $val: expr) => {
179 #[derive(Copy, Clone)]
180 struct $name;
181 impl Static<$type> for $name {
182 fn val(self) -> $type {
183 $val
184 }
185 }
186 };
187 }
188
189 define!(Bf: bool = false);
190 define!(Bt: bool = true);
191 define!(N1: usize = 1);
192 define!(N2: usize = 2);
193 define!(N3: usize = 3);
194 define!(N4: usize = 4);
195 define!(N5: usize = 5);
196 define!(N6: usize = 6);
197
198 #[derive(Copy, Clone)]
199 struct On;
200
201 impl<T: Copy> Static<Option<T>> for On {
val(self) -> Option<T>202 fn val(self) -> Option<T> {
203 None
204 }
205 }
206
207 #[derive(Copy, Clone)]
208 struct Os<T>(T);
209
210 impl<T: Copy> Static<Option<T>> for Os<T> {
val(self) -> Option<T>211 fn val(self) -> Option<T> {
212 Some(self.0)
213 }
214 }
215
216 macro_rules! dispatch {
217 (let $var: ident: bool = $val: expr; $($body: tt)*) => {
218 if $val {
219 let $var = Bt; dispatch!($($body)*)
220 } else {
221 let $var = Bf; dispatch!($($body)*)
222 }
223 };
224 (let $var: ident: usize = $val: expr; $($body: tt)*) => {
225 match $val {
226 1 => { let $var = N1; dispatch!($($body)*) },
227 2 => { let $var = N2; dispatch!($($body)*) },
228 3 => { let $var = N3; dispatch!($($body)*) },
229 4 => { let $var = N4; dispatch!($($body)*) },
230 5 => { let $var = N5; dispatch!($($body)*) },
231 6 => { let $var = N6; dispatch!($($body)*) },
232 _ => panic!(),
233 }
234 };
235 (let $var: ident: Option<$type: ty> = $val: expr; $($body: tt)*) => {
236 match $val {
237 None => { let $var = On; dispatch!($($body)*) },
238 Some(x) => { let $var = Os(x); dispatch!($($body)*) },
239 }
240 };
241 ($body: expr) => { $body };
242 }
243
chunk_unchecked<T>(x: &[T], n: usize, i: usize) -> &[T]244 fn chunk_unchecked<T>(x: &[T], n: usize, i: usize) -> &[T] {
245 safety_assert!((i + 1) * n <= x.len());
246 // SAFETY: Ensured by correctness requirements (and asserted above).
247 unsafe { core::slice::from_raw_parts(x.as_ptr().add(n * i), n) }
248 }
249
chunk_mut_unchecked<T>(x: &mut [T], n: usize, i: usize) -> &mut [T]250 fn chunk_mut_unchecked<T>(x: &mut [T], n: usize, i: usize) -> &mut [T] {
251 safety_assert!((i + 1) * n <= x.len());
252 // SAFETY: Ensured by correctness requirements (and asserted above).
253 unsafe { core::slice::from_raw_parts_mut(x.as_mut_ptr().add(n * i), n) }
254 }
255
div_ceil(x: usize, m: usize) -> usize256 fn div_ceil(x: usize, m: usize) -> usize {
257 (x + m - 1) / m
258 }
259
floor(x: usize, m: usize) -> usize260 fn floor(x: usize, m: usize) -> usize {
261 x / m * m
262 }
263
264 #[inline]
vectorize<F: FnMut(usize)>(n: usize, bs: usize, mut f: F)265 fn vectorize<F: FnMut(usize)>(n: usize, bs: usize, mut f: F) {
266 for k in 0 .. n / bs {
267 for i in k * bs .. (k + 1) * bs {
268 f(i);
269 }
270 }
271 for i in floor(n, bs) .. n {
272 f(i);
273 }
274 }
275
276 /// Decoding error kind
277 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
278 pub enum DecodeKind {
279 /// Invalid length
280 Length,
281
282 /// Invalid symbol
283 Symbol,
284
285 /// Non-zero trailing bits
286 Trailing,
287
288 /// Invalid padding length
289 Padding,
290 }
291
292 impl core::fmt::Display for DecodeKind {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result293 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
294 let description = match self {
295 DecodeKind::Length => "invalid length",
296 DecodeKind::Symbol => "invalid symbol",
297 DecodeKind::Trailing => "non-zero trailing bits",
298 DecodeKind::Padding => "invalid padding length",
299 };
300 write!(f, "{}", description)
301 }
302 }
303
304 /// Decoding error
305 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
306 pub struct DecodeError {
307 /// Error position
308 ///
309 /// This position is always a valid input position and represents the first encountered error.
310 pub position: usize,
311
312 /// Error kind
313 pub kind: DecodeKind,
314 }
315
316 #[cfg(feature = "std")]
317 impl std::error::Error for DecodeError {}
318
319 impl core::fmt::Display for DecodeError {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result320 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
321 write!(f, "{} at {}", self.kind, self.position)
322 }
323 }
324
325 /// Decoding error with partial result
326 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
327 pub struct DecodePartial {
328 /// Number of bytes read from input
329 ///
330 /// This number does not exceed the error position: `read <= error.position`.
331 pub read: usize,
332
333 /// Number of bytes written to output
334 ///
335 /// This number does not exceed the decoded length: `written <= decode_len(read)`.
336 pub written: usize,
337
338 /// Decoding error
339 pub error: DecodeError,
340 }
341
342 const INVALID: u8 = 128;
343 const IGNORE: u8 = 129;
344 const PADDING: u8 = 130;
345
order(msb: bool, n: usize, i: usize) -> usize346 fn order(msb: bool, n: usize, i: usize) -> usize {
347 if msb {
348 n - 1 - i
349 } else {
350 i
351 }
352 }
353
354 #[inline]
enc(bit: usize) -> usize355 fn enc(bit: usize) -> usize {
356 match bit {
357 1 | 2 | 4 => 1,
358 3 | 6 => 3,
359 5 => 5,
360 _ => unreachable!(),
361 }
362 }
363
364 #[inline]
dec(bit: usize) -> usize365 fn dec(bit: usize) -> usize {
366 enc(bit) * 8 / bit
367 }
368
encode_len<B: Static<usize>>(bit: B, len: usize) -> usize369 fn encode_len<B: Static<usize>>(bit: B, len: usize) -> usize {
370 div_ceil(8 * len, bit.val())
371 }
372
encode_block<B: Static<usize>, M: Static<bool>>( bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8], )373 fn encode_block<B: Static<usize>, M: Static<bool>>(
374 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
375 ) {
376 debug_assert!(input.len() <= enc(bit.val()));
377 debug_assert_eq!(output.len(), encode_len(bit, input.len()));
378 let bit = bit.val();
379 let msb = msb.val();
380 let mut x = 0u64;
381 for (i, input) in input.iter().enumerate() {
382 x |= u64::from(*input) << (8 * order(msb, enc(bit), i));
383 }
384 for (i, output) in output.iter_mut().enumerate() {
385 let y = x >> (bit * order(msb, dec(bit), i));
386 *output = symbols[(y & 0xff) as usize];
387 }
388 }
389
encode_mut<B: Static<usize>, M: Static<bool>>( bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8], )390 fn encode_mut<B: Static<usize>, M: Static<bool>>(
391 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
392 ) {
393 debug_assert_eq!(output.len(), encode_len(bit, input.len()));
394 let enc = enc(bit.val());
395 let dec = dec(bit.val());
396 let n = input.len() / enc;
397 let bs = match bit.val() {
398 5 => 2,
399 6 => 4,
400 _ => 1,
401 };
402 vectorize(n, bs, |i| {
403 let input = chunk_unchecked(input, enc, i);
404 let output = chunk_mut_unchecked(output, dec, i);
405 encode_block(bit, msb, symbols, input, output);
406 });
407 encode_block(bit, msb, symbols, &input[enc * n ..], &mut output[dec * n ..]);
408 }
409
410 // Fails if an input character does not translate to a symbol. The error is the
411 // lowest index of such character. The output is not written to.
decode_block<B: Static<usize>, M: Static<bool>>( bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8], ) -> Result<(), usize>412 fn decode_block<B: Static<usize>, M: Static<bool>>(
413 bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
414 ) -> Result<(), usize> {
415 debug_assert!(output.len() <= enc(bit.val()));
416 debug_assert_eq!(input.len(), encode_len(bit, output.len()));
417 let bit = bit.val();
418 let msb = msb.val();
419 let mut x = 0u64;
420 for j in 0 .. input.len() {
421 let y = values[input[j] as usize];
422 check!(j, y < 1 << bit);
423 x |= u64::from(y) << (bit * order(msb, dec(bit), j));
424 }
425 for (j, output) in output.iter_mut().enumerate() {
426 *output = ((x >> (8 * order(msb, enc(bit), j))) & 0xff) as u8;
427 }
428 Ok(())
429 }
430
431 // Fails if an input character does not translate to a symbol. The error `pos`
432 // is the lowest index of such character. The output is valid up to `pos / dec *
433 // enc` excluded.
decode_mut<B: Static<usize>, M: Static<bool>>( bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8], ) -> Result<(), usize>434 fn decode_mut<B: Static<usize>, M: Static<bool>>(
435 bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
436 ) -> Result<(), usize> {
437 debug_assert_eq!(input.len(), encode_len(bit, output.len()));
438 let enc = enc(bit.val());
439 let dec = dec(bit.val());
440 let n = input.len() / dec;
441 for i in 0 .. n {
442 let input = chunk_unchecked(input, dec, i);
443 let output = chunk_mut_unchecked(output, enc, i);
444 decode_block(bit, msb, values, input, output).map_err(|e| dec * i + e)?;
445 }
446 decode_block(bit, msb, values, &input[dec * n ..], &mut output[enc * n ..])
447 .map_err(|e| dec * n + e)
448 }
449
450 // Fails if there are non-zero trailing bits.
check_trail<B: Static<usize>, M: Static<bool>>( bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8], ) -> Result<(), ()>451 fn check_trail<B: Static<usize>, M: Static<bool>>(
452 bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8],
453 ) -> Result<(), ()> {
454 if 8 % bit.val() == 0 || !ctb {
455 return Ok(());
456 }
457 let trail = bit.val() * input.len() % 8;
458 if trail == 0 {
459 return Ok(());
460 }
461 let mut mask = (1 << trail) - 1;
462 if !msb.val() {
463 mask <<= bit.val() - trail;
464 }
465 check!((), values[input[input.len() - 1] as usize] & mask == 0);
466 Ok(())
467 }
468
469 // Fails if the padding length is invalid. The error is the index of the first
470 // padding character.
check_pad<B: Static<usize>>(bit: B, values: &[u8; 256], input: &[u8]) -> Result<usize, usize>471 fn check_pad<B: Static<usize>>(bit: B, values: &[u8; 256], input: &[u8]) -> Result<usize, usize> {
472 let bit = bit.val();
473 debug_assert_eq!(input.len(), dec(bit));
474 let is_pad = |x: &&u8| values[**x as usize] == PADDING;
475 let count = input.iter().rev().take_while(is_pad).count();
476 let len = input.len() - count;
477 check!(len, len > 0 && bit * len % 8 < bit);
478 Ok(len)
479 }
480
encode_base_len<B: Static<usize>>(bit: B, len: usize) -> usize481 fn encode_base_len<B: Static<usize>>(bit: B, len: usize) -> usize {
482 encode_len(bit, len)
483 }
484
encode_base<B: Static<usize>, M: Static<bool>>( bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8], )485 fn encode_base<B: Static<usize>, M: Static<bool>>(
486 bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
487 ) {
488 debug_assert_eq!(output.len(), encode_base_len(bit, input.len()));
489 encode_mut(bit, msb, symbols, input, output);
490 }
491
encode_pad_len<B: Static<usize>, P: Static<Option<u8>>>(bit: B, pad: P, len: usize) -> usize492 fn encode_pad_len<B: Static<usize>, P: Static<Option<u8>>>(bit: B, pad: P, len: usize) -> usize {
493 match pad.val() {
494 None => encode_base_len(bit, len),
495 Some(_) => div_ceil(len, enc(bit.val())) * dec(bit.val()),
496 }
497 }
498
encode_pad<B: Static<usize>, M: Static<bool>, P: Static<Option<u8>>>( bit: B, msb: M, symbols: &[u8; 256], spad: P, input: &[u8], output: &mut [u8], )499 fn encode_pad<B: Static<usize>, M: Static<bool>, P: Static<Option<u8>>>(
500 bit: B, msb: M, symbols: &[u8; 256], spad: P, input: &[u8], output: &mut [u8],
501 ) {
502 let pad = match spad.val() {
503 None => return encode_base(bit, msb, symbols, input, output),
504 Some(pad) => pad,
505 };
506 debug_assert_eq!(output.len(), encode_pad_len(bit, spad, input.len()));
507 let olen = encode_base_len(bit, input.len());
508 encode_base(bit, msb, symbols, input, &mut output[.. olen]);
509 for output in output.iter_mut().skip(olen) {
510 *output = pad;
511 }
512 }
513
encode_wrap_len< 'a, B: Static<usize>, P: Static<Option<u8>>, W: Static<Option<(usize, &'a [u8])>>, >( bit: B, pad: P, wrap: W, ilen: usize, ) -> usize514 fn encode_wrap_len<
515 'a,
516 B: Static<usize>,
517 P: Static<Option<u8>>,
518 W: Static<Option<(usize, &'a [u8])>>,
519 >(
520 bit: B, pad: P, wrap: W, ilen: usize,
521 ) -> usize {
522 let olen = encode_pad_len(bit, pad, ilen);
523 match wrap.val() {
524 None => olen,
525 Some((col, end)) => olen + end.len() * div_ceil(olen, col),
526 }
527 }
528
encode_wrap_mut< 'a, B: Static<usize>, M: Static<bool>, P: Static<Option<u8>>, W: Static<Option<(usize, &'a [u8])>>, >( bit: B, msb: M, symbols: &[u8; 256], pad: P, wrap: W, input: &[u8], output: &mut [u8], )529 fn encode_wrap_mut<
530 'a,
531 B: Static<usize>,
532 M: Static<bool>,
533 P: Static<Option<u8>>,
534 W: Static<Option<(usize, &'a [u8])>>,
535 >(
536 bit: B, msb: M, symbols: &[u8; 256], pad: P, wrap: W, input: &[u8], output: &mut [u8],
537 ) {
538 let (col, end) = match wrap.val() {
539 None => return encode_pad(bit, msb, symbols, pad, input, output),
540 Some((col, end)) => (col, end),
541 };
542 debug_assert_eq!(output.len(), encode_wrap_len(bit, pad, wrap, input.len()));
543 debug_assert_eq!(col % dec(bit.val()), 0);
544 let col = col / dec(bit.val());
545 let enc = col * enc(bit.val());
546 let dec = col * dec(bit.val()) + end.len();
547 let olen = dec - end.len();
548 let n = input.len() / enc;
549 for i in 0 .. n {
550 let input = chunk_unchecked(input, enc, i);
551 let output = chunk_mut_unchecked(output, dec, i);
552 encode_base(bit, msb, symbols, input, &mut output[.. olen]);
553 output[olen ..].copy_from_slice(end);
554 }
555 if input.len() > enc * n {
556 let olen = dec * n + encode_pad_len(bit, pad, input.len() - enc * n);
557 encode_pad(bit, msb, symbols, pad, &input[enc * n ..], &mut output[dec * n .. olen]);
558 output[olen ..].copy_from_slice(end);
559 }
560 }
561
562 // Returns the longest valid input length and associated output length.
decode_wrap_len<B: Static<usize>, P: Static<bool>>( bit: B, pad: P, len: usize, ) -> (usize, usize)563 fn decode_wrap_len<B: Static<usize>, P: Static<bool>>(
564 bit: B, pad: P, len: usize,
565 ) -> (usize, usize) {
566 let bit = bit.val();
567 if pad.val() {
568 (floor(len, dec(bit)), len / dec(bit) * enc(bit))
569 } else {
570 let trail = bit * len % 8;
571 (len - trail / bit, bit * len / 8)
572 }
573 }
574
575 // Fails with Length if length is invalid. The error is the largest valid
576 // length.
decode_pad_len<B: Static<usize>, P: Static<bool>>( bit: B, pad: P, len: usize, ) -> Result<usize, DecodeError>577 fn decode_pad_len<B: Static<usize>, P: Static<bool>>(
578 bit: B, pad: P, len: usize,
579 ) -> Result<usize, DecodeError> {
580 let (ilen, olen) = decode_wrap_len(bit, pad, len);
581 check!(DecodeError { position: ilen, kind: DecodeKind::Length }, ilen == len);
582 Ok(olen)
583 }
584
585 // Fails with Length if length is invalid. The error is the largest valid
586 // length.
decode_base_len<B: Static<usize>>(bit: B, len: usize) -> Result<usize, DecodeError>587 fn decode_base_len<B: Static<usize>>(bit: B, len: usize) -> Result<usize, DecodeError> {
588 decode_pad_len(bit, Bf, len)
589 }
590
591 // Fails with Symbol if an input character does not translate to a symbol. The
592 // error is the lowest index of such character.
593 // Fails with Trailing if there are non-zero trailing bits.
decode_base_mut<B: Static<usize>, M: Static<bool>>( bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8], output: &mut [u8], ) -> Result<usize, DecodePartial>594 fn decode_base_mut<B: Static<usize>, M: Static<bool>>(
595 bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8], output: &mut [u8],
596 ) -> Result<usize, DecodePartial> {
597 debug_assert_eq!(Ok(output.len()), decode_base_len(bit, input.len()));
598 let fail = |pos, kind| DecodePartial {
599 read: pos / dec(bit.val()) * dec(bit.val()),
600 written: pos / dec(bit.val()) * enc(bit.val()),
601 error: DecodeError { position: pos, kind },
602 };
603 decode_mut(bit, msb, values, input, output).map_err(|pos| fail(pos, DecodeKind::Symbol))?;
604 check_trail(bit, msb, ctb, values, input)
605 .map_err(|()| fail(input.len() - 1, DecodeKind::Trailing))?;
606 Ok(output.len())
607 }
608
609 // Fails with Symbol if an input character does not translate to a symbol. The
610 // error is the lowest index of such character.
611 // Fails with Padding if some padding length is invalid. The error is the index
612 // of the first padding character of the invalid padding.
613 // Fails with Trailing if there are non-zero trailing bits.
decode_pad_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>>( bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8], ) -> Result<usize, DecodePartial>614 fn decode_pad_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
615 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
616 ) -> Result<usize, DecodePartial> {
617 if !pad.val() {
618 return decode_base_mut(bit, msb, ctb, values, input, output);
619 }
620 debug_assert_eq!(Ok(output.len()), decode_pad_len(bit, pad, input.len()));
621 let enc = enc(bit.val());
622 let dec = dec(bit.val());
623 let mut inpos = 0;
624 let mut outpos = 0;
625 let mut outend = output.len();
626 while inpos < input.len() {
627 match decode_base_mut(
628 bit,
629 msb,
630 ctb,
631 values,
632 &input[inpos ..],
633 &mut output[outpos .. outend],
634 ) {
635 Ok(written) => {
636 if cfg!(debug_assertions) {
637 inpos = input.len();
638 }
639 outpos += written;
640 break;
641 }
642 Err(partial) => {
643 inpos += partial.read;
644 outpos += partial.written;
645 }
646 }
647 let inlen =
648 check_pad(bit, values, &input[inpos .. inpos + dec]).map_err(|pos| DecodePartial {
649 read: inpos,
650 written: outpos,
651 error: DecodeError { position: inpos + pos, kind: DecodeKind::Padding },
652 })?;
653 let outlen = decode_base_len(bit, inlen).unwrap();
654 let written = decode_base_mut(
655 bit,
656 msb,
657 ctb,
658 values,
659 &input[inpos .. inpos + inlen],
660 &mut output[outpos .. outpos + outlen],
661 )
662 .map_err(|partial| {
663 debug_assert_eq!(partial.read, 0);
664 debug_assert_eq!(partial.written, 0);
665 DecodePartial {
666 read: inpos,
667 written: outpos,
668 error: DecodeError {
669 position: inpos + partial.error.position,
670 kind: partial.error.kind,
671 },
672 }
673 })?;
674 debug_assert_eq!(written, outlen);
675 inpos += dec;
676 outpos += outlen;
677 outend -= enc - outlen;
678 }
679 debug_assert_eq!(inpos, input.len());
680 debug_assert_eq!(outpos, outend);
681 Ok(outend)
682 }
683
skip_ignore(values: &[u8; 256], input: &[u8], mut inpos: usize) -> usize684 fn skip_ignore(values: &[u8; 256], input: &[u8], mut inpos: usize) -> usize {
685 while inpos < input.len() && values[input[inpos] as usize] == IGNORE {
686 inpos += 1;
687 }
688 inpos
689 }
690
691 // Returns next input and output position.
692 // Fails with Symbol if an input character does not translate to a symbol. The
693 // error is the lowest index of such character.
694 // Fails with Padding if some padding length is invalid. The error is the index
695 // of the first padding character of the invalid padding.
696 // Fails with Trailing if there are non-zero trailing bits.
decode_wrap_block<B: Static<usize>, M: Static<bool>, P: Static<bool>>( bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8], ) -> Result<(usize, usize), DecodeError>697 fn decode_wrap_block<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
698 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
699 ) -> Result<(usize, usize), DecodeError> {
700 let dec = dec(bit.val());
701 let mut buf = [0u8; 8];
702 let mut shift = [0usize; 8];
703 let mut bufpos = 0;
704 let mut inpos = 0;
705 while bufpos < dec {
706 inpos = skip_ignore(values, input, inpos);
707 if inpos == input.len() {
708 break;
709 }
710 shift[bufpos] = inpos;
711 buf[bufpos] = input[inpos];
712 bufpos += 1;
713 inpos += 1;
714 }
715 let olen = decode_pad_len(bit, pad, bufpos).map_err(|mut e| {
716 e.position = shift[e.position];
717 e
718 })?;
719 let written = decode_pad_mut(bit, msb, ctb, values, pad, &buf[.. bufpos], &mut output[.. olen])
720 .map_err(|partial| {
721 debug_assert_eq!(partial.read, 0);
722 debug_assert_eq!(partial.written, 0);
723 DecodeError { position: shift[partial.error.position], kind: partial.error.kind }
724 })?;
725 Ok((inpos, written))
726 }
727
728 // Fails with Symbol if an input character does not translate to a symbol. The
729 // error is the lowest index of such character.
730 // Fails with Padding if some padding length is invalid. The error is the index
731 // of the first padding character of the invalid padding.
732 // Fails with Trailing if there are non-zero trailing bits.
733 // Fails with Length if input length (without ignored characters) is invalid.
734 #[allow(clippy::too_many_arguments)]
decode_wrap_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>, I: Static<bool>>( bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, has_ignore: I, input: &[u8], output: &mut [u8], ) -> Result<usize, DecodePartial>735 fn decode_wrap_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>, I: Static<bool>>(
736 bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, has_ignore: I, input: &[u8],
737 output: &mut [u8],
738 ) -> Result<usize, DecodePartial> {
739 if !has_ignore.val() {
740 return decode_pad_mut(bit, msb, ctb, values, pad, input, output);
741 }
742 debug_assert_eq!(output.len(), decode_wrap_len(bit, pad, input.len()).1);
743 let mut inpos = 0;
744 let mut outpos = 0;
745 while inpos < input.len() {
746 let (inlen, outlen) = decode_wrap_len(bit, pad, input.len() - inpos);
747 match decode_pad_mut(
748 bit,
749 msb,
750 ctb,
751 values,
752 pad,
753 &input[inpos .. inpos + inlen],
754 &mut output[outpos .. outpos + outlen],
755 ) {
756 Ok(written) => {
757 inpos += inlen;
758 outpos += written;
759 break;
760 }
761 Err(partial) => {
762 inpos += partial.read;
763 outpos += partial.written;
764 }
765 }
766 let (ipos, opos) =
767 decode_wrap_block(bit, msb, ctb, values, pad, &input[inpos ..], &mut output[outpos ..])
768 .map_err(|mut error| {
769 error.position += inpos;
770 DecodePartial { read: inpos, written: outpos, error }
771 })?;
772 inpos += ipos;
773 outpos += opos;
774 }
775 let inpos = skip_ignore(values, input, inpos);
776 if inpos == input.len() {
777 Ok(outpos)
778 } else {
779 Err(DecodePartial {
780 read: inpos,
781 written: outpos,
782 error: DecodeError { position: inpos, kind: DecodeKind::Length },
783 })
784 }
785 }
786
787 /// Order in which bits are read from a byte
788 ///
789 /// The base-conversion encoding is always little-endian. This means that the least significant
790 /// **byte** is always first. However, we can still choose whether, within a byte, this is the most
791 /// significant or the least significant **bit** that is first. If the terminology is confusing,
792 /// testing on an asymmetrical example should be enough to choose the correct value.
793 ///
794 /// # Examples
795 ///
796 /// In the following example, we can see that a base with the `MostSignificantFirst` bit-order has
797 /// the most significant bit first in the encoded output. In particular, the output is in the same
798 /// order as the bits in the byte. The opposite happens with the `LeastSignificantFirst` bit-order.
799 /// The least significant bit is first and the output is in the reverse order.
800 ///
801 /// ```rust
802 /// use data_encoding::{BitOrder, Specification};
803 /// let mut spec = Specification::new();
804 /// spec.symbols.push_str("01");
805 /// spec.bit_order = BitOrder::MostSignificantFirst; // default
806 /// let msb = spec.encoding().unwrap();
807 /// spec.bit_order = BitOrder::LeastSignificantFirst;
808 /// let lsb = spec.encoding().unwrap();
809 /// assert_eq!(msb.encode(&[0b01010011]), "01010011");
810 /// assert_eq!(lsb.encode(&[0b01010011]), "11001010");
811 /// ```
812 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
813 #[cfg(feature = "alloc")]
814 pub enum BitOrder {
815 /// Most significant bit first
816 ///
817 /// This is the most common and most intuitive bit-order. In particular, this is the bit-order
818 /// used by [RFC4648] and thus the usual hexadecimal, base64, base32, base64url, and base32hex
819 /// encodings. This is the default bit-order when [specifying](struct.Specification.html) a
820 /// base.
821 ///
822 /// [RFC4648]: https://tools.ietf.org/html/rfc4648
823 MostSignificantFirst,
824
825 /// Least significant bit first
826 ///
827 /// # Examples
828 ///
829 /// DNSCurve [base32] uses least significant bit first:
830 ///
831 /// ```rust
832 /// use data_encoding::BASE32_DNSCURVE;
833 /// assert_eq!(BASE32_DNSCURVE.encode(&[0x64, 0x88]), "4321");
834 /// assert_eq!(BASE32_DNSCURVE.decode(b"4321").unwrap(), vec![0x64, 0x88]);
835 /// ```
836 ///
837 /// [base32]: constant.BASE32_DNSCURVE.html
838 LeastSignificantFirst,
839 }
840 #[cfg(feature = "alloc")]
841 use crate::BitOrder::*;
842
843 #[doc(hidden)]
844 #[cfg(feature = "alloc")]
845 pub type InternalEncoding = Cow<'static, [u8]>;
846
847 #[doc(hidden)]
848 #[cfg(not(feature = "alloc"))]
849 pub type InternalEncoding = &'static [u8];
850
851 /// Base-conversion encoding
852 ///
853 /// See [Specification](struct.Specification.html) for technical details or how to define a new one.
854 // Required fields:
855 // 0 - 256 (256) symbols
856 // 256 - 512 (256) values
857 // 512 - 513 ( 1) padding
858 // 513 - 514 ( 1) reserved(3),ctb(1),msb(1),bit(3)
859 // Optional fields:
860 // 514 - 515 ( 1) width
861 // 515 - * ( N) separator
862 // Invariants:
863 // - symbols is 2^bit unique characters repeated 2^(8-bit) times
864 // - values[128 ..] are INVALID
865 // - values[0 .. 128] are either INVALID, IGNORE, PADDING, or < 2^bit
866 // - padding is either < 128 or INVALID
867 // - values[padding] is PADDING if padding < 128
868 // - values and symbols are inverse
869 // - ctb is true if 8 % bit == 0
870 // - width is present if there is x such that values[x] is IGNORE
871 // - width % dec(bit) == 0
872 // - for all x in separator values[x] is IGNORE
873 #[derive(Debug, Clone, PartialEq, Eq)]
874 #[repr(transparent)]
875 pub struct Encoding(#[doc(hidden)] pub InternalEncoding);
876
877 /// How to translate characters when decoding
878 ///
879 /// The order matters. The first character of the `from` field is translated to the first character
880 /// of the `to` field. The second to the second. Etc.
881 ///
882 /// See [Specification](struct.Specification.html) for more information.
883 #[derive(Debug, Clone)]
884 #[cfg(feature = "alloc")]
885 pub struct Translate {
886 /// Characters to translate from
887 pub from: String,
888
889 /// Characters to translate to
890 pub to: String,
891 }
892
893 /// How to wrap the output when encoding
894 ///
895 /// See [Specification](struct.Specification.html) for more information.
896 #[derive(Debug, Clone)]
897 #[cfg(feature = "alloc")]
898 pub struct Wrap {
899 /// Wrapping width
900 ///
901 /// Must be a multiple of:
902 ///
903 /// - 8 for a bit-width of 1 (binary), 3 (octal), and 5 (base32)
904 /// - 4 for a bit-width of 2 (base4) and 6 (base64)
905 /// - 2 for a bit-width of 4 (hexadecimal)
906 ///
907 /// Wrapping is disabled if null.
908 pub width: usize,
909
910 /// Wrapping characters
911 ///
912 /// Wrapping is disabled if empty.
913 pub separator: String,
914 }
915
916 /// Base-conversion specification
917 ///
918 /// It is possible to define custom encodings given a specification. To do so, it is important to
919 /// understand the theory first.
920 ///
921 /// # Theory
922 ///
923 /// Each subsection has an equivalent subsection in the [Practice](#practice) section.
924 ///
925 /// ## Basics
926 ///
927 /// The main idea of a [base-conversion] encoding is to see `[u8]` as numbers written in
928 /// little-endian base256 and convert them in another little-endian base. For performance reasons,
929 /// this crate restricts this other base to be of size 2 (binary), 4 (base4), 8 (octal), 16
930 /// (hexadecimal), 32 (base32), or 64 (base64). The converted number is written as `[u8]` although
931 /// it doesn't use all the 256 possible values of `u8`. This crate encodes to ASCII, so only values
932 /// smaller than 128 are allowed.
933 ///
934 /// More precisely, we need the following elements:
935 ///
936 /// - The bit-width N: 1 for binary, 2 for base4, 3 for octal, 4 for hexadecimal, 5 for base32, and
937 /// 6 for base64
938 /// - The [bit-order](enum.BitOrder.html): most or least significant bit first
939 /// - The symbols function S from [0, 2<sup>N</sup>) (called values and written `uN`) to symbols
940 /// (represented as `u8` although only ASCII symbols are allowed, i.e. smaller than 128)
941 /// - The values partial function V from ASCII to [0, 2<sup>N</sup>), i.e. from `u8` to `uN`
942 /// - Whether trailing bits are checked: trailing bits are leading zeros in theory, but since
943 /// numbers are little-endian they come last
944 ///
945 /// For the encoding to be correct (i.e. encoding then decoding gives back the initial input),
946 /// V(S(i)) must be defined and equal to i for all i in [0, 2<sup>N</sup>). For the encoding to be
947 /// [canonical][canonical] (i.e. different inputs decode to different outputs, or equivalently,
948 /// decoding then encoding gives back the initial input), trailing bits must be checked and if V(i)
949 /// is defined then S(V(i)) is equal to i for all i.
950 ///
951 /// Encoding and decoding are given by the following pipeline:
952 ///
953 /// ```text
954 /// [u8] <--1--> [[bit; 8]] <--2--> [[bit; N]] <--3--> [uN] <--4--> [u8]
955 /// 1: Map bit-order between each u8 and [bit; 8]
956 /// 2: Base conversion between base 2^8 and base 2^N (check trailing bits)
957 /// 3: Map bit-order between each [bit; N] and uN
958 /// 4: Map symbols/values between each uN and u8 (values must be defined)
959 /// ```
960 ///
961 /// ## Extensions
962 ///
963 /// All these extensions make the encoding not canonical.
964 ///
965 /// ### Padding
966 ///
967 /// Padding is useful if the following conditions are met:
968 ///
969 /// - the bit-width is 3 (octal), 5 (base32), or 6 (base64)
970 /// - the length of the data to encode is not known in advance
971 /// - the data must be sent without buffering
972 ///
973 /// Bases for which the bit-width N does not divide 8 may not concatenate encoded data. This comes
974 /// from the fact that it is not possible to make the difference between trailing bits and encoding
975 /// bits. Padding solves this issue by adding a new character to discriminate between trailing bits
976 /// and encoding bits. The idea is to work by blocks of lcm(8, N) bits, where lcm(8, N) is the least
977 /// common multiple of 8 and N. When such block is not complete, it is padded.
978 ///
979 /// To preserve correctness, the padding character must not be a symbol.
980 ///
981 /// ### Ignore characters when decoding
982 ///
983 /// Ignoring characters when decoding is useful if after encoding some characters are added for
984 /// convenience or any other reason (like wrapping). In that case we want to first ignore those
985 /// characters before decoding.
986 ///
987 /// To preserve correctness, ignored characters must not contain symbols or the padding character.
988 ///
989 /// ### Wrap output when encoding
990 ///
991 /// Wrapping output when encoding is useful if the output is meant to be printed in a document where
992 /// width is limited (typically 80-columns documents). In that case, the wrapping width and the
993 /// wrapping separator have to be defined.
994 ///
995 /// To preserve correctness, the wrapping separator characters must be ignored (see previous
996 /// subsection). As such, wrapping separator characters must also not contain symbols or the padding
997 /// character.
998 ///
999 /// ### Translate characters when decoding
1000 ///
1001 /// Translating characters when decoding is useful when encoded data may be copied by a humain
1002 /// instead of a machine. Humans tend to confuse some characters for others. In that case we want to
1003 /// translate those characters before decoding.
1004 ///
1005 /// To preserve correctness, the characters we translate _from_ must not contain symbols or the
1006 /// padding character, and the characters we translate _to_ must only contain symbols or the padding
1007 /// character.
1008 ///
1009 /// # Practice
1010 ///
1011 /// ## Basics
1012 ///
1013 /// ```rust
1014 /// use data_encoding::{Encoding, Specification};
1015 /// fn make_encoding(symbols: &str) -> Encoding {
1016 /// let mut spec = Specification::new();
1017 /// spec.symbols.push_str(symbols);
1018 /// spec.encoding().unwrap()
1019 /// }
1020 /// let binary = make_encoding("01");
1021 /// let octal = make_encoding("01234567");
1022 /// let hexadecimal = make_encoding("0123456789abcdef");
1023 /// assert_eq!(binary.encode(b"Bit"), "010000100110100101110100");
1024 /// assert_eq!(octal.encode(b"Bit"), "20464564");
1025 /// assert_eq!(hexadecimal.encode(b"Bit"), "426974");
1026 /// ```
1027 ///
1028 /// The `binary` base has 2 symbols `0` and `1` with value 0 and 1 respectively. The `octal` base
1029 /// has 8 symbols `0` to `7` with value 0 to 7. The `hexadecimal` base has 16 symbols `0` to `9` and
1030 /// `a` to `f` with value 0 to 15. The following diagram gives the idea of how encoding works in the
1031 /// previous example (note that we can actually write such diagram only because the bit-order is
1032 /// most significant first):
1033 ///
1034 /// ```text
1035 /// [ octal] | 2 : 0 : 4 : 6 : 4 : 5 : 6 : 4 |
1036 /// [ binary] |0 1 0 0 0 0 1 0|0 1 1 0 1 0 0 1|0 1 1 1 0 1 0 0|
1037 /// [hexadecimal] | 4 : 2 | 6 : 9 | 7 : 4 |
1038 /// ^-- LSB ^-- MSB
1039 /// ```
1040 ///
1041 /// Note that in theory, these little-endian numbers are read from right to left (the most
1042 /// significant bit is at the right). Since leading zeros are meaningless (in our usual decimal
1043 /// notation 0123 is the same as 123), it explains why trailing bits must be zero. Trailing bits may
1044 /// occur when the bit-width of a base does not divide 8. Only binary, base4, and hexadecimal don't
1045 /// have trailing bits issues. So let's consider octal and base64, which have trailing bits in
1046 /// similar circumstances:
1047 ///
1048 /// ```rust
1049 /// use data_encoding::{Specification, BASE64_NOPAD};
1050 /// let octal = {
1051 /// let mut spec = Specification::new();
1052 /// spec.symbols.push_str("01234567");
1053 /// spec.encoding().unwrap()
1054 /// };
1055 /// assert_eq!(BASE64_NOPAD.encode(b"B"), "Qg");
1056 /// assert_eq!(octal.encode(b"B"), "204");
1057 /// ```
1058 ///
1059 /// We have the following diagram, where the base64 values are written between parentheses:
1060 ///
1061 /// ```text
1062 /// [base64] | Q(16) : g(32) : [has 4 zero trailing bits]
1063 /// [ octal] | 2 : 0 : 4 : [has 1 zero trailing bit ]
1064 /// |0 1 0 0 0 0 1 0|0 0 0 0
1065 /// [ ascii] | B |
1066 /// ^-^-^-^-- leading zeros / trailing bits
1067 /// ```
1068 ///
1069 /// ## Extensions
1070 ///
1071 /// ### Padding
1072 ///
1073 /// For octal and base64, lcm(8, 3) == lcm(8, 6) == 24 bits or 3 bytes. For base32, lcm(8, 5) is 40
1074 /// bits or 5 bytes. Let's consider octal and base64:
1075 ///
1076 /// ```rust
1077 /// use data_encoding::{Specification, BASE64};
1078 /// let octal = {
1079 /// let mut spec = Specification::new();
1080 /// spec.symbols.push_str("01234567");
1081 /// spec.padding = Some('=');
1082 /// spec.encoding().unwrap()
1083 /// };
1084 /// // We start encoding but we only have "B" for now.
1085 /// assert_eq!(BASE64.encode(b"B"), "Qg==");
1086 /// assert_eq!(octal.encode(b"B"), "204=====");
1087 /// // Now we have "it".
1088 /// assert_eq!(BASE64.encode(b"it"), "aXQ=");
1089 /// assert_eq!(octal.encode(b"it"), "322720==");
1090 /// // By concatenating everything, we may decode the original data.
1091 /// assert_eq!(BASE64.decode(b"Qg==aXQ=").unwrap(), b"Bit");
1092 /// assert_eq!(octal.decode(b"204=====322720==").unwrap(), b"Bit");
1093 /// ```
1094 ///
1095 /// We have the following diagrams:
1096 ///
1097 /// ```text
1098 /// [base64] | Q(16) : g(32) : = : = |
1099 /// [ octal] | 2 : 0 : 4 : = : = : = : = : = |
1100 /// |0 1 0 0 0 0 1 0|. . . . . . . .|. . . . . . . .|
1101 /// [ ascii] | B | end of block aligned --^
1102 /// ^-- beginning of block aligned
1103 ///
1104 /// [base64] | a(26) : X(23) : Q(16) : = |
1105 /// [ octal] | 3 : 2 : 2 : 7 : 2 : 0 : = : = |
1106 /// |0 1 1 0 1 0 0 1|0 1 1 1 0 1 0 0|. . . . . . . .|
1107 /// [ ascii] | i | t |
1108 /// ```
1109 ///
1110 /// ### Ignore characters when decoding
1111 ///
1112 /// The typical use-case is to ignore newlines (`\r` and `\n`). But to keep the example small, we
1113 /// will ignore spaces.
1114 ///
1115 /// ```rust
1116 /// let mut spec = data_encoding::HEXLOWER.specification();
1117 /// spec.ignore.push_str(" \t");
1118 /// let base = spec.encoding().unwrap();
1119 /// assert_eq!(base.decode(b"42 69 74"), base.decode(b"426974"));
1120 /// ```
1121 ///
1122 /// ### Wrap output when encoding
1123 ///
1124 /// The typical use-case is to wrap after 64 or 76 characters with a newline (`\r\n` or `\n`). But
1125 /// to keep the example small, we will wrap after 8 characters with a space.
1126 ///
1127 /// ```rust
1128 /// let mut spec = data_encoding::BASE64.specification();
1129 /// spec.wrap.width = 8;
1130 /// spec.wrap.separator.push_str(" ");
1131 /// let base64 = spec.encoding().unwrap();
1132 /// assert_eq!(base64.encode(b"Hey you"), "SGV5IHlv dQ== ");
1133 /// ```
1134 ///
1135 /// Note that the output always ends with the separator.
1136 ///
1137 /// ### Translate characters when decoding
1138 ///
1139 /// The typical use-case is to translate lowercase to uppercase or reciprocally, but it is also used
1140 /// for letters that look alike, like `O0` or `Il1`. Let's illustrate both examples.
1141 ///
1142 /// ```rust
1143 /// let mut spec = data_encoding::HEXLOWER.specification();
1144 /// spec.translate.from.push_str("ABCDEFOIl");
1145 /// spec.translate.to.push_str("abcdef011");
1146 /// let base = spec.encoding().unwrap();
1147 /// assert_eq!(base.decode(b"BOIl"), base.decode(b"b011"));
1148 /// ```
1149 ///
1150 /// [base-conversion]: https://en.wikipedia.org/wiki/Positional_notation#Base_conversion
1151 /// [canonical]: https://tools.ietf.org/html/rfc4648#section-3.5
1152 #[derive(Debug, Clone)]
1153 #[cfg(feature = "alloc")]
1154 pub struct Specification {
1155 /// Symbols
1156 ///
1157 /// The number of symbols must be 2, 4, 8, 16, 32, or 64. Symbols must be ASCII characters
1158 /// (smaller than 128) and they must be unique.
1159 pub symbols: String,
1160
1161 /// Bit-order
1162 ///
1163 /// The default is to use most significant bit first since it is the most common.
1164 pub bit_order: BitOrder,
1165
1166 /// Check trailing bits
1167 ///
1168 /// The default is to check trailing bits. This field is ignored when unnecessary (i.e. for
1169 /// base2, base4, and base16).
1170 pub check_trailing_bits: bool,
1171
1172 /// Padding
1173 ///
1174 /// The default is to not use padding. The padding character must be ASCII and must not be a
1175 /// symbol.
1176 pub padding: Option<char>,
1177
1178 /// Characters to ignore when decoding
1179 ///
1180 /// The default is to not ignore characters when decoding. The characters to ignore must be
1181 /// ASCII and must not be symbols or the padding character.
1182 pub ignore: String,
1183
1184 /// How to wrap the output when encoding
1185 ///
1186 /// The default is to not wrap the output when encoding. The wrapping characters must be ASCII
1187 /// and must not be symbols or the padding character.
1188 pub wrap: Wrap,
1189
1190 /// How to translate characters when decoding
1191 ///
1192 /// The default is to not translate characters when decoding. The characters to translate from
1193 /// must be ASCII and must not have already been assigned a semantics. The characters to
1194 /// translate to must be ASCII and must have been assigned a semantics (symbol, padding
1195 /// character, or ignored character).
1196 pub translate: Translate,
1197 }
1198
1199 #[cfg(feature = "alloc")]
1200 impl Default for Specification {
default() -> Self1201 fn default() -> Self {
1202 Self::new()
1203 }
1204 }
1205
1206 impl Encoding {
sym(&self) -> &[u8; 256]1207 fn sym(&self) -> &[u8; 256] {
1208 self.0[0 .. 256].try_into().unwrap()
1209 }
1210
val(&self) -> &[u8; 256]1211 fn val(&self) -> &[u8; 256] {
1212 self.0[256 .. 512].try_into().unwrap()
1213 }
1214
pad(&self) -> Option<u8>1215 fn pad(&self) -> Option<u8> {
1216 if self.0[512] < 128 {
1217 Some(self.0[512])
1218 } else {
1219 None
1220 }
1221 }
1222
ctb(&self) -> bool1223 fn ctb(&self) -> bool {
1224 self.0[513] & 0x10 != 0
1225 }
1226
msb(&self) -> bool1227 fn msb(&self) -> bool {
1228 self.0[513] & 0x8 != 0
1229 }
1230
bit(&self) -> usize1231 fn bit(&self) -> usize {
1232 (self.0[513] & 0x7) as usize
1233 }
1234
1235 /// Minimum number of input and output blocks when encoding
block_len(&self) -> (usize, usize)1236 fn block_len(&self) -> (usize, usize) {
1237 let bit = self.bit();
1238 match self.wrap() {
1239 Some((col, end)) => (col / dec(bit) * enc(bit), col + end.len()),
1240 None => (enc(bit), dec(bit)),
1241 }
1242 }
1243
wrap(&self) -> Option<(usize, &[u8])>1244 fn wrap(&self) -> Option<(usize, &[u8])> {
1245 if self.0.len() <= 515 {
1246 return None;
1247 }
1248 Some((self.0[514] as usize, &self.0[515 ..]))
1249 }
1250
has_ignore(&self) -> bool1251 fn has_ignore(&self) -> bool {
1252 self.0.len() >= 515
1253 }
1254
1255 /// Returns the encoded length of an input of length `len`
1256 ///
1257 /// See [`encode_mut`] for when to use it.
1258 ///
1259 /// [`encode_mut`]: struct.Encoding.html#method.encode_mut
1260 #[must_use]
encode_len(&self, len: usize) -> usize1261 pub fn encode_len(&self, len: usize) -> usize {
1262 dispatch! {
1263 let bit: usize = self.bit();
1264 let pad: Option<u8> = self.pad();
1265 let wrap: Option<(usize, &[u8])> = self.wrap();
1266 encode_wrap_len(bit, pad, wrap, len)
1267 }
1268 }
1269
1270 /// Encodes `input` in `output`
1271 ///
1272 /// # Panics
1273 ///
1274 /// Panics if the `output` length does not match the result of [`encode_len`] for the `input`
1275 /// length.
1276 ///
1277 /// # Examples
1278 ///
1279 /// ```rust
1280 /// use data_encoding::BASE64;
1281 /// # let mut buffer = vec![0; 100];
1282 /// let input = b"Hello world";
1283 /// let output = &mut buffer[0 .. BASE64.encode_len(input.len())];
1284 /// BASE64.encode_mut(input, output);
1285 /// assert_eq!(output, b"SGVsbG8gd29ybGQ=");
1286 /// ```
1287 ///
1288 /// [`encode_len`]: struct.Encoding.html#method.encode_len
1289 #[allow(clippy::cognitive_complexity)]
encode_mut(&self, input: &[u8], output: &mut [u8])1290 pub fn encode_mut(&self, input: &[u8], output: &mut [u8]) {
1291 assert_eq!(output.len(), self.encode_len(input.len()));
1292 dispatch! {
1293 let bit: usize = self.bit();
1294 let msb: bool = self.msb();
1295 let pad: Option<u8> = self.pad();
1296 let wrap: Option<(usize, &[u8])> = self.wrap();
1297 encode_wrap_mut(bit, msb, self.sym(), pad, wrap, input, output)
1298 }
1299 }
1300
1301 /// Appends the encoding of `input` to `output`
1302 ///
1303 /// # Examples
1304 ///
1305 /// ```rust
1306 /// use data_encoding::BASE64;
1307 /// # let mut buffer = vec![0; 100];
1308 /// let input = b"Hello world";
1309 /// let mut output = "Result: ".to_string();
1310 /// BASE64.encode_append(input, &mut output);
1311 /// assert_eq!(output, "Result: SGVsbG8gd29ybGQ=");
1312 /// ```
1313 #[cfg(feature = "alloc")]
encode_append(&self, input: &[u8], output: &mut String)1314 pub fn encode_append(&self, input: &[u8], output: &mut String) {
1315 // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted below).
1316 let output = unsafe { output.as_mut_vec() };
1317 let output_len = output.len();
1318 output.resize(output_len + self.encode_len(input.len()), 0u8);
1319 self.encode_mut(input, &mut output[output_len ..]);
1320 safety_assert!(output[output_len ..].is_ascii());
1321 }
1322
1323 /// Returns an object to encode a fragmented input and append it to `output`
1324 ///
1325 /// See the documentation of [`Encoder`] for more details and examples.
1326 #[cfg(feature = "alloc")]
new_encoder<'a>(&'a self, output: &'a mut String) -> Encoder<'a>1327 pub fn new_encoder<'a>(&'a self, output: &'a mut String) -> Encoder<'a> {
1328 Encoder::new(self, output)
1329 }
1330
1331 /// Writes the encoding of `input` to `output`
1332 ///
1333 /// This allocates a buffer of 1024 bytes on the stack. If you want to control the buffer size
1334 /// and location, use [`Encoding::encode_write_buffer()`] instead.
1335 ///
1336 /// # Errors
1337 ///
1338 /// Returns an error when writing to the output fails.
encode_write( &self, input: &[u8], output: &mut impl core::fmt::Write, ) -> core::fmt::Result1339 pub fn encode_write(
1340 &self, input: &[u8], output: &mut impl core::fmt::Write,
1341 ) -> core::fmt::Result {
1342 self.encode_write_buffer(input, output, &mut [0; 1024])
1343 }
1344
1345 /// Writes the encoding of `input` to `output` using a temporary `buffer`
1346 ///
1347 /// # Panics
1348 ///
1349 /// Panics if the buffer is shorter than 510 bytes.
1350 ///
1351 /// # Errors
1352 ///
1353 /// Returns an error when writing to the output fails.
encode_write_buffer( &self, input: &[u8], output: &mut impl core::fmt::Write, buffer: &mut [u8], ) -> core::fmt::Result1354 pub fn encode_write_buffer(
1355 &self, input: &[u8], output: &mut impl core::fmt::Write, buffer: &mut [u8],
1356 ) -> core::fmt::Result {
1357 assert!(510 <= buffer.len());
1358 let (enc, dec) = self.block_len();
1359 for input in input.chunks(buffer.len() / dec * enc) {
1360 let buffer = &mut buffer[.. self.encode_len(input.len())];
1361 self.encode_mut(input, buffer);
1362 safety_assert!(buffer.is_ascii());
1363 // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted above).
1364 output.write_str(unsafe { core::str::from_utf8_unchecked(buffer) })?;
1365 }
1366 Ok(())
1367 }
1368
1369 /// Returns an object to display the encoding of `input`
1370 ///
1371 /// # Examples
1372 ///
1373 /// ```rust
1374 /// use data_encoding::BASE64;
1375 /// assert_eq!(
1376 /// format!("Payload: {}", BASE64.encode_display(b"Hello world")),
1377 /// "Payload: SGVsbG8gd29ybGQ=",
1378 /// );
1379 /// ```
1380 #[must_use]
encode_display<'a>(&'a self, input: &'a [u8]) -> Display<'a>1381 pub fn encode_display<'a>(&'a self, input: &'a [u8]) -> Display<'a> {
1382 Display { encoding: self, input }
1383 }
1384
1385 /// Returns encoded `input`
1386 ///
1387 /// # Examples
1388 ///
1389 /// ```rust
1390 /// use data_encoding::BASE64;
1391 /// assert_eq!(BASE64.encode(b"Hello world"), "SGVsbG8gd29ybGQ=");
1392 /// ```
1393 #[cfg(feature = "alloc")]
1394 #[must_use]
encode(&self, input: &[u8]) -> String1395 pub fn encode(&self, input: &[u8]) -> String {
1396 let mut output = vec![0u8; self.encode_len(input.len())];
1397 self.encode_mut(input, &mut output);
1398 safety_assert!(output.is_ascii());
1399 // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted above).
1400 unsafe { String::from_utf8_unchecked(output) }
1401 }
1402
1403 /// Returns the maximum decoded length of an input of length `len`
1404 ///
1405 /// See [`decode_mut`] for when to use it. In particular, the actual decoded length might be
1406 /// smaller if the actual input contains padding or ignored characters.
1407 ///
1408 /// # Errors
1409 ///
1410 /// Returns an error if `len` is invalid. The error kind is [`Length`] and the [position] is the
1411 /// greatest valid input length.
1412 ///
1413 /// [`decode_mut`]: struct.Encoding.html#method.decode_mut
1414 /// [`Length`]: enum.DecodeKind.html#variant.Length
1415 /// [position]: struct.DecodeError.html#structfield.position
decode_len(&self, len: usize) -> Result<usize, DecodeError>1416 pub fn decode_len(&self, len: usize) -> Result<usize, DecodeError> {
1417 let (ilen, olen) = dispatch! {
1418 let bit: usize = self.bit();
1419 let pad: bool = self.pad().is_some();
1420 decode_wrap_len(bit, pad, len)
1421 };
1422 check!(
1423 DecodeError { position: ilen, kind: DecodeKind::Length },
1424 self.has_ignore() || len == ilen
1425 );
1426 Ok(olen)
1427 }
1428
1429 /// Decodes `input` in `output`
1430 ///
1431 /// Returns the length of the decoded output. This length may be smaller than the output length
1432 /// if the input contained padding or ignored characters. The output bytes after the returned
1433 /// length are not initialized and should not be read.
1434 ///
1435 /// # Panics
1436 ///
1437 /// Panics if the `output` length does not match the result of [`decode_len`] for the `input`
1438 /// length. Also panics if `decode_len` fails for the `input` length.
1439 ///
1440 /// # Errors
1441 ///
1442 /// Returns an error if `input` is invalid. See [`decode`] for more details. The are two
1443 /// differences though:
1444 ///
1445 /// - [`Length`] may be returned only if the encoding allows ignored characters, because
1446 /// otherwise this is already checked by [`decode_len`].
1447 /// - The [`read`] first bytes of the input have been successfully decoded to the [`written`]
1448 /// first bytes of the output.
1449 ///
1450 /// # Examples
1451 ///
1452 /// ```rust
1453 /// use data_encoding::BASE64;
1454 /// # let mut buffer = vec![0; 100];
1455 /// let input = b"SGVsbA==byB3b3JsZA==";
1456 /// let output = &mut buffer[0 .. BASE64.decode_len(input.len()).unwrap()];
1457 /// let len = BASE64.decode_mut(input, output).unwrap();
1458 /// assert_eq!(&output[0 .. len], b"Hello world");
1459 /// ```
1460 ///
1461 /// [`decode_len`]: struct.Encoding.html#method.decode_len
1462 /// [`decode`]: struct.Encoding.html#method.decode
1463 /// [`Length`]: enum.DecodeKind.html#variant.Length
1464 /// [`read`]: struct.DecodePartial.html#structfield.read
1465 /// [`written`]: struct.DecodePartial.html#structfield.written
1466 #[allow(clippy::cognitive_complexity)]
decode_mut(&self, input: &[u8], output: &mut [u8]) -> Result<usize, DecodePartial>1467 pub fn decode_mut(&self, input: &[u8], output: &mut [u8]) -> Result<usize, DecodePartial> {
1468 assert_eq!(Ok(output.len()), self.decode_len(input.len()));
1469 dispatch! {
1470 let bit: usize = self.bit();
1471 let msb: bool = self.msb();
1472 let pad: bool = self.pad().is_some();
1473 let has_ignore: bool = self.has_ignore();
1474 decode_wrap_mut(bit, msb, self.ctb(), self.val(), pad, has_ignore,
1475 input, output)
1476 }
1477 }
1478
1479 /// Returns decoded `input`
1480 ///
1481 /// # Errors
1482 ///
1483 /// Returns an error if `input` is invalid. The error kind can be:
1484 ///
1485 /// - [`Length`] if the input length is invalid. The [position] is the greatest valid input
1486 /// length.
1487 /// - [`Symbol`] if the input contains an invalid character. The [position] is the first invalid
1488 /// character.
1489 /// - [`Trailing`] if the input has non-zero trailing bits. This is only possible if the
1490 /// encoding checks trailing bits. The [position] is the first character containing non-zero
1491 /// trailing bits.
1492 /// - [`Padding`] if the input has an invalid padding length. This is only possible if the
1493 /// encoding uses padding. The [position] is the first padding character of the first padding
1494 /// of invalid length.
1495 ///
1496 /// # Examples
1497 ///
1498 /// ```rust
1499 /// use data_encoding::BASE64;
1500 /// assert_eq!(BASE64.decode(b"SGVsbA==byB3b3JsZA==").unwrap(), b"Hello world");
1501 /// ```
1502 ///
1503 /// [`Length`]: enum.DecodeKind.html#variant.Length
1504 /// [`Symbol`]: enum.DecodeKind.html#variant.Symbol
1505 /// [`Trailing`]: enum.DecodeKind.html#variant.Trailing
1506 /// [`Padding`]: enum.DecodeKind.html#variant.Padding
1507 /// [position]: struct.DecodeError.html#structfield.position
1508 #[cfg(feature = "alloc")]
decode(&self, input: &[u8]) -> Result<Vec<u8>, DecodeError>1509 pub fn decode(&self, input: &[u8]) -> Result<Vec<u8>, DecodeError> {
1510 let mut output = vec![0u8; self.decode_len(input.len())?];
1511 let len = self.decode_mut(input, &mut output).map_err(|partial| partial.error)?;
1512 output.truncate(len);
1513 Ok(output)
1514 }
1515
1516 /// Returns the bit-width
1517 #[must_use]
bit_width(&self) -> usize1518 pub fn bit_width(&self) -> usize {
1519 self.bit()
1520 }
1521
1522 /// Returns whether the encoding is canonical
1523 ///
1524 /// An encoding is not canonical if one of the following conditions holds:
1525 ///
1526 /// - trailing bits are not checked
1527 /// - padding is used
1528 /// - characters are ignored
1529 /// - characters are translated
1530 #[must_use]
is_canonical(&self) -> bool1531 pub fn is_canonical(&self) -> bool {
1532 if !self.ctb() {
1533 return false;
1534 }
1535 let bit = self.bit();
1536 let sym = self.sym();
1537 let val = self.val();
1538 for i in 0 .. 256 {
1539 if val[i] == INVALID {
1540 continue;
1541 }
1542 if val[i] >= 1 << bit {
1543 return false;
1544 }
1545 if sym[val[i] as usize] as usize != i {
1546 return false;
1547 }
1548 }
1549 true
1550 }
1551
1552 /// Returns the encoding specification
1553 #[allow(clippy::missing_panics_doc)] // no panic
1554 #[cfg(feature = "alloc")]
1555 #[must_use]
specification(&self) -> Specification1556 pub fn specification(&self) -> Specification {
1557 let mut specification = Specification::new();
1558 specification
1559 .symbols
1560 .push_str(core::str::from_utf8(&self.sym()[0 .. 1 << self.bit()]).unwrap());
1561 specification.bit_order =
1562 if self.msb() { MostSignificantFirst } else { LeastSignificantFirst };
1563 specification.check_trailing_bits = self.ctb();
1564 if let Some(pad) = self.pad() {
1565 specification.padding = Some(pad as char);
1566 }
1567 for i in 0 .. 128u8 {
1568 if self.val()[i as usize] != IGNORE {
1569 continue;
1570 }
1571 specification.ignore.push(i as char);
1572 }
1573 if let Some((col, end)) = self.wrap() {
1574 specification.wrap.width = col;
1575 specification.wrap.separator = core::str::from_utf8(end).unwrap().to_owned();
1576 }
1577 for i in 0 .. 128u8 {
1578 let canonical = if self.val()[i as usize] < 1 << self.bit() {
1579 self.sym()[self.val()[i as usize] as usize]
1580 } else if self.val()[i as usize] == PADDING {
1581 self.pad().unwrap()
1582 } else {
1583 continue;
1584 };
1585 if i == canonical {
1586 continue;
1587 }
1588 specification.translate.from.push(i as char);
1589 specification.translate.to.push(canonical as char);
1590 }
1591 specification
1592 }
1593
1594 #[doc(hidden)]
1595 #[must_use]
internal_new(implementation: &'static [u8]) -> Encoding1596 pub const fn internal_new(implementation: &'static [u8]) -> Encoding {
1597 #[cfg(feature = "alloc")]
1598 let encoding = Encoding(Cow::Borrowed(implementation));
1599 #[cfg(not(feature = "alloc"))]
1600 let encoding = Encoding(implementation);
1601 encoding
1602 }
1603
1604 #[doc(hidden)]
1605 #[must_use]
internal_implementation(&self) -> &[u8]1606 pub fn internal_implementation(&self) -> &[u8] {
1607 &self.0
1608 }
1609 }
1610
1611 /// Encodes fragmented input to an output
1612 ///
1613 /// It is equivalent to use an [`Encoder`] with multiple calls to [`Encoder::append()`] than to
1614 /// first concatenate all the input and then use [`Encoding::encode_append()`]. In particular, this
1615 /// function will not introduce padding or wrapping between inputs.
1616 ///
1617 /// # Examples
1618 ///
1619 /// ```rust
1620 /// // This is a bit inconvenient but we can't take a long-term reference to data_encoding::BASE64
1621 /// // because it's a constant. We need to use a static which has an address instead. This will be
1622 /// // fixed in version 3 of the library.
1623 /// static BASE64: data_encoding::Encoding = data_encoding::BASE64;
1624 /// let mut output = String::new();
1625 /// let mut encoder = BASE64.new_encoder(&mut output);
1626 /// encoder.append(b"hello");
1627 /// encoder.append(b"world");
1628 /// encoder.finalize();
1629 /// assert_eq!(output, BASE64.encode(b"helloworld"));
1630 /// ```
1631 #[derive(Debug)]
1632 #[cfg(feature = "alloc")]
1633 pub struct Encoder<'a> {
1634 encoding: &'a Encoding,
1635 output: &'a mut String,
1636 buffer: [u8; 255],
1637 length: u8,
1638 }
1639
1640 #[cfg(feature = "alloc")]
1641 impl Drop for Encoder<'_> {
drop(&mut self)1642 fn drop(&mut self) {
1643 self.encoding.encode_append(&self.buffer[.. self.length as usize], self.output);
1644 }
1645 }
1646
1647 #[cfg(feature = "alloc")]
1648 impl<'a> Encoder<'a> {
new(encoding: &'a Encoding, output: &'a mut String) -> Self1649 fn new(encoding: &'a Encoding, output: &'a mut String) -> Self {
1650 Encoder { encoding, output, buffer: [0; 255], length: 0 }
1651 }
1652
1653 /// Encodes the provided input fragment and appends the result to the output
append(&mut self, mut input: &[u8])1654 pub fn append(&mut self, mut input: &[u8]) {
1655 #[allow(clippy::cast_possible_truncation)] // no truncation
1656 let max = self.encoding.block_len().0 as u8;
1657 if self.length != 0 {
1658 let len = self.length;
1659 #[allow(clippy::cast_possible_truncation)] // no truncation
1660 let add = core::cmp::min((max - len) as usize, input.len()) as u8;
1661 self.buffer[len as usize ..][.. add as usize].copy_from_slice(&input[.. add as usize]);
1662 self.length += add;
1663 input = &input[add as usize ..];
1664 if self.length != max {
1665 debug_assert!(self.length < max);
1666 debug_assert!(input.is_empty());
1667 return;
1668 }
1669 self.encoding.encode_append(&self.buffer[.. max as usize], self.output);
1670 self.length = 0;
1671 }
1672 let len = floor(input.len(), max as usize);
1673 self.encoding.encode_append(&input[.. len], self.output);
1674 input = &input[len ..];
1675 #[allow(clippy::cast_possible_truncation)] // no truncation
1676 let len = input.len() as u8;
1677 self.buffer[.. len as usize].copy_from_slice(input);
1678 self.length = len;
1679 }
1680
1681 /// Makes sure all inputs have been encoded and appended to the output
1682 ///
1683 /// This is equivalent to dropping the encoder and required for correctness, otherwise some
1684 /// encoded data may be missing at the end.
finalize(self)1685 pub fn finalize(self) {}
1686 }
1687
1688 /// Wraps an encoding and input for display purposes.
1689 #[derive(Debug)]
1690 pub struct Display<'a> {
1691 encoding: &'a Encoding,
1692 input: &'a [u8],
1693 }
1694
1695 impl core::fmt::Display for Display<'_> {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result1696 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1697 self.encoding.encode_write(self.input, f)
1698 }
1699 }
1700
1701 #[derive(Debug, Copy, Clone)]
1702 #[cfg(feature = "alloc")]
1703 enum SpecificationErrorImpl {
1704 BadSize,
1705 NotAscii,
1706 Duplicate(u8),
1707 ExtraPadding,
1708 WrapLength,
1709 WrapWidth(u8),
1710 FromTo,
1711 Undefined(u8),
1712 }
1713 #[cfg(feature = "alloc")]
1714 use crate::SpecificationErrorImpl::*;
1715
1716 /// Specification error
1717 #[derive(Debug, Copy, Clone)]
1718 #[cfg(feature = "alloc")]
1719 pub struct SpecificationError(SpecificationErrorImpl);
1720
1721 #[cfg(feature = "alloc")]
1722 impl core::fmt::Display for SpecificationError {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result1723 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1724 match self.0 {
1725 BadSize => write!(f, "invalid number of symbols"),
1726 NotAscii => write!(f, "non-ascii character"),
1727 Duplicate(c) => write!(f, "{:?} has conflicting definitions", c as char),
1728 ExtraPadding => write!(f, "unnecessary padding"),
1729 WrapLength => write!(f, "invalid wrap width or separator length"),
1730 WrapWidth(x) => write!(f, "wrap width not a multiple of {}", x),
1731 FromTo => write!(f, "translate from/to length mismatch"),
1732 Undefined(c) => write!(f, "{:?} is undefined", c as char),
1733 }
1734 }
1735 }
1736
1737 #[cfg(feature = "std")]
1738 impl std::error::Error for SpecificationError {
description(&self) -> &str1739 fn description(&self) -> &str {
1740 match self.0 {
1741 BadSize => "invalid number of symbols",
1742 NotAscii => "non-ascii character",
1743 Duplicate(_) => "conflicting definitions",
1744 ExtraPadding => "unnecessary padding",
1745 WrapLength => "invalid wrap width or separator length",
1746 WrapWidth(_) => "wrap width not a multiple",
1747 FromTo => "translate from/to length mismatch",
1748 Undefined(_) => "undefined character",
1749 }
1750 }
1751 }
1752
1753 #[cfg(feature = "alloc")]
1754 impl Specification {
1755 /// Returns a default specification
1756 #[must_use]
new() -> Specification1757 pub fn new() -> Specification {
1758 Specification {
1759 symbols: String::new(),
1760 bit_order: MostSignificantFirst,
1761 check_trailing_bits: true,
1762 padding: None,
1763 ignore: String::new(),
1764 wrap: Wrap { width: 0, separator: String::new() },
1765 translate: Translate { from: String::new(), to: String::new() },
1766 }
1767 }
1768
1769 /// Returns the specified encoding
1770 ///
1771 /// # Errors
1772 ///
1773 /// Returns an error if the specification is invalid.
encoding(&self) -> Result<Encoding, SpecificationError>1774 pub fn encoding(&self) -> Result<Encoding, SpecificationError> {
1775 let symbols = self.symbols.as_bytes();
1776 let bit: u8 = match symbols.len() {
1777 2 => 1,
1778 4 => 2,
1779 8 => 3,
1780 16 => 4,
1781 32 => 5,
1782 64 => 6,
1783 _ => return Err(SpecificationError(BadSize)),
1784 };
1785 let mut values = [INVALID; 128];
1786 let set = |v: &mut [u8; 128], i: u8, x: u8| {
1787 check!(SpecificationError(NotAscii), i < 128);
1788 if v[i as usize] == x {
1789 return Ok(());
1790 }
1791 check!(SpecificationError(Duplicate(i)), v[i as usize] == INVALID);
1792 v[i as usize] = x;
1793 Ok(())
1794 };
1795 for (v, symbols) in symbols.iter().enumerate() {
1796 #[allow(clippy::cast_possible_truncation)] // no truncation
1797 set(&mut values, *symbols, v as u8)?;
1798 }
1799 let msb = self.bit_order == MostSignificantFirst;
1800 let ctb = self.check_trailing_bits || 8 % bit == 0;
1801 let pad = match self.padding {
1802 None => None,
1803 Some(pad) => {
1804 check!(SpecificationError(ExtraPadding), 8 % bit != 0);
1805 check!(SpecificationError(NotAscii), pad.len_utf8() == 1);
1806 set(&mut values, pad as u8, PADDING)?;
1807 Some(pad as u8)
1808 }
1809 };
1810 for i in self.ignore.bytes() {
1811 set(&mut values, i, IGNORE)?;
1812 }
1813 let wrap = if self.wrap.separator.is_empty() || self.wrap.width == 0 {
1814 None
1815 } else {
1816 let col = self.wrap.width;
1817 let end = self.wrap.separator.as_bytes();
1818 check!(SpecificationError(WrapLength), col < 256 && end.len() < 256);
1819 #[allow(clippy::cast_possible_truncation)] // no truncation
1820 let col = col as u8;
1821 #[allow(clippy::cast_possible_truncation)] // no truncation
1822 let dec = dec(bit as usize) as u8;
1823 check!(SpecificationError(WrapWidth(dec)), col % dec == 0);
1824 for &i in end {
1825 set(&mut values, i, IGNORE)?;
1826 }
1827 Some((col, end))
1828 };
1829 let from = self.translate.from.as_bytes();
1830 let to = self.translate.to.as_bytes();
1831 check!(SpecificationError(FromTo), from.len() == to.len());
1832 for i in 0 .. from.len() {
1833 check!(SpecificationError(NotAscii), to[i] < 128);
1834 let v = values[to[i] as usize];
1835 check!(SpecificationError(Undefined(to[i])), v != INVALID);
1836 set(&mut values, from[i], v)?;
1837 }
1838 let mut encoding = Vec::new();
1839 for _ in 0 .. 256 / symbols.len() {
1840 encoding.extend_from_slice(symbols);
1841 }
1842 encoding.extend_from_slice(&values);
1843 encoding.extend_from_slice(&[INVALID; 128]);
1844 match pad {
1845 None => encoding.push(INVALID),
1846 Some(pad) => encoding.push(pad),
1847 }
1848 encoding.push(bit);
1849 if msb {
1850 encoding[513] |= 0x08;
1851 }
1852 if ctb {
1853 encoding[513] |= 0x10;
1854 }
1855 if let Some((col, end)) = wrap {
1856 encoding.push(col);
1857 encoding.extend_from_slice(end);
1858 } else if values.contains(&IGNORE) {
1859 encoding.push(0);
1860 }
1861 Ok(Encoding(Cow::Owned(encoding)))
1862 }
1863 }
1864
1865 /// Lowercase hexadecimal encoding
1866 ///
1867 /// This encoding is a static version of:
1868 ///
1869 /// ```rust
1870 /// # use data_encoding::{Specification, HEXLOWER};
1871 /// let mut spec = Specification::new();
1872 /// spec.symbols.push_str("0123456789abcdef");
1873 /// assert_eq!(HEXLOWER, spec.encoding().unwrap());
1874 /// ```
1875 ///
1876 /// # Examples
1877 ///
1878 /// ```rust
1879 /// use data_encoding::HEXLOWER;
1880 /// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1881 /// assert_eq!(HEXLOWER.decode(b"deadbeef").unwrap(), deadbeef);
1882 /// assert_eq!(HEXLOWER.encode(&deadbeef), "deadbeef");
1883 /// ```
1884 pub const HEXLOWER: Encoding = Encoding::internal_new(HEXLOWER_IMPL);
1885 const HEXLOWER_IMPL: &[u8] = &[
1886 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1887 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1888 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1889 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1890 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1891 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1892 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1893 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1894 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1895 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1896 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1897 56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1898 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1899 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
1900 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1901 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1902 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1903 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1904 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1905 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1906 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1907 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1908 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1909 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1910 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1911 ];
1912
1913 /// Lowercase hexadecimal encoding with case-insensitive decoding
1914 ///
1915 /// This encoding is a static version of:
1916 ///
1917 /// ```rust
1918 /// # use data_encoding::{Specification, HEXLOWER_PERMISSIVE};
1919 /// let mut spec = Specification::new();
1920 /// spec.symbols.push_str("0123456789abcdef");
1921 /// spec.translate.from.push_str("ABCDEF");
1922 /// spec.translate.to.push_str("abcdef");
1923 /// assert_eq!(HEXLOWER_PERMISSIVE, spec.encoding().unwrap());
1924 /// ```
1925 ///
1926 /// # Examples
1927 ///
1928 /// ```rust
1929 /// use data_encoding::HEXLOWER_PERMISSIVE;
1930 /// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1931 /// assert_eq!(HEXLOWER_PERMISSIVE.decode(b"DeadBeef").unwrap(), deadbeef);
1932 /// assert_eq!(HEXLOWER_PERMISSIVE.encode(&deadbeef), "deadbeef");
1933 /// ```
1934 ///
1935 /// You can also define a shorter name:
1936 ///
1937 /// ```rust
1938 /// use data_encoding::{Encoding, HEXLOWER_PERMISSIVE};
1939 /// const HEX: Encoding = HEXLOWER_PERMISSIVE;
1940 /// ```
1941 pub const HEXLOWER_PERMISSIVE: Encoding = Encoding::internal_new(HEXLOWER_PERMISSIVE_IMPL);
1942 const HEXLOWER_PERMISSIVE_IMPL: &[u8] = &[
1943 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1944 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1945 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1946 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1947 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1948 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1949 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1950 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1951 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1952 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1953 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1954 56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1955 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1956 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
1957 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128,
1958 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1959 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1960 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1961 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1962 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1963 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1964 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1965 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1966 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1967 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1968 ];
1969
1970 /// Uppercase hexadecimal encoding
1971 ///
1972 /// This encoding is a static version of:
1973 ///
1974 /// ```rust
1975 /// # use data_encoding::{Specification, HEXUPPER};
1976 /// let mut spec = Specification::new();
1977 /// spec.symbols.push_str("0123456789ABCDEF");
1978 /// assert_eq!(HEXUPPER, spec.encoding().unwrap());
1979 /// ```
1980 ///
1981 /// It is compliant with [RFC4648] and known as "base16" or "hex".
1982 ///
1983 /// # Examples
1984 ///
1985 /// ```rust
1986 /// use data_encoding::HEXUPPER;
1987 /// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1988 /// assert_eq!(HEXUPPER.decode(b"DEADBEEF").unwrap(), deadbeef);
1989 /// assert_eq!(HEXUPPER.encode(&deadbeef), "DEADBEEF");
1990 /// ```
1991 ///
1992 /// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-8
1993 pub const HEXUPPER: Encoding = Encoding::internal_new(HEXUPPER_IMPL);
1994 const HEXUPPER_IMPL: &[u8] = &[
1995 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
1996 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
1997 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
1998 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
1999 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2000 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2001 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2002 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2003 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2004 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2005 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2006 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2007 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2008 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2009 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2010 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2011 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2012 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2013 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2014 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2015 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2016 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2017 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2018 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2019 ];
2020
2021 /// Uppercase hexadecimal encoding with case-insensitive decoding
2022 ///
2023 /// This encoding is a static version of:
2024 ///
2025 /// ```rust
2026 /// # use data_encoding::{Specification, HEXUPPER_PERMISSIVE};
2027 /// let mut spec = Specification::new();
2028 /// spec.symbols.push_str("0123456789ABCDEF");
2029 /// spec.translate.from.push_str("abcdef");
2030 /// spec.translate.to.push_str("ABCDEF");
2031 /// assert_eq!(HEXUPPER_PERMISSIVE, spec.encoding().unwrap());
2032 /// ```
2033 ///
2034 /// # Examples
2035 ///
2036 /// ```rust
2037 /// use data_encoding::HEXUPPER_PERMISSIVE;
2038 /// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
2039 /// assert_eq!(HEXUPPER_PERMISSIVE.decode(b"DeadBeef").unwrap(), deadbeef);
2040 /// assert_eq!(HEXUPPER_PERMISSIVE.encode(&deadbeef), "DEADBEEF");
2041 /// ```
2042 pub const HEXUPPER_PERMISSIVE: Encoding = Encoding::internal_new(HEXUPPER_PERMISSIVE_IMPL);
2043 const HEXUPPER_PERMISSIVE_IMPL: &[u8] = &[
2044 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2045 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2046 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2047 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2048 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2049 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2050 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2051 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2052 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2053 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2054 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2055 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2056 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2057 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2058 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2059 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128,
2060 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2061 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2062 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2063 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2064 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2065 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2066 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2067 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2068 ];
2069
2070 /// Padded base32 encoding
2071 ///
2072 /// This encoding is a static version of:
2073 ///
2074 /// ```rust
2075 /// # use data_encoding::{Specification, BASE32};
2076 /// let mut spec = Specification::new();
2077 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2078 /// spec.padding = Some('=');
2079 /// assert_eq!(BASE32, spec.encoding().unwrap());
2080 /// ```
2081 ///
2082 /// It conforms to [RFC4648].
2083 ///
2084 /// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-6
2085 pub const BASE32: Encoding = Encoding::internal_new(BASE32_IMPL);
2086 const BASE32_IMPL: &[u8] = &[
2087 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2088 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2089 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2090 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2091 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2092 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2093 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2094 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2095 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2096 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2097 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2098 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2099 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2100 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 130, 128, 128,
2101 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2102 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2103 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2104 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2105 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2106 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2107 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2108 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2109 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2110 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2111 ];
2112
2113 /// Unpadded base32 encoding
2114 ///
2115 /// This encoding is a static version of:
2116 ///
2117 /// ```rust
2118 /// # use data_encoding::{Specification, BASE32_NOPAD};
2119 /// let mut spec = Specification::new();
2120 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2121 /// assert_eq!(BASE32_NOPAD, spec.encoding().unwrap());
2122 /// ```
2123 pub const BASE32_NOPAD: Encoding = Encoding::internal_new(BASE32_NOPAD_IMPL);
2124 const BASE32_NOPAD_IMPL: &[u8] = &[
2125 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2126 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2127 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2128 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2129 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2130 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2131 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2132 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2133 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2134 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2135 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2136 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2137 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2138 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2139 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2140 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2141 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2142 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2143 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2144 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2145 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2146 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2147 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2148 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2149 ];
2150
2151 /// Unpadded base32 encoding with case-insensitive decoding
2152 ///
2153 /// This encoding is a static version of:
2154 ///
2155 /// ```rust
2156 /// # use data_encoding::{Specification, BASE32_NOPAD_NOCASE};
2157 /// let mut spec = Specification::new();
2158 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2159 /// spec.translate.from.push_str("abcdefghijklmnopqrstuvwxyz");
2160 /// spec.translate.to.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2161 /// assert_eq!(BASE32_NOPAD_NOCASE, spec.encoding().unwrap());
2162 /// ```
2163 pub const BASE32_NOPAD_NOCASE: Encoding = Encoding::internal_new(BASE32_NOPAD_NOCASE_IMPL);
2164 const BASE32_NOPAD_NOCASE_IMPL: &[u8] = &[
2165 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2166 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2167 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2168 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2169 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2170 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2171 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2172 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2173 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2174 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2175 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2176 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2177 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2178 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2179 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2180 25, 128, 128, 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2181 18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2182 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2183 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2184 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2185 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2186 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2187 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2188 128, 128, 128, 128, 128, 128, 128, 128, 29,
2189 ];
2190
2191 /// Unpadded base32 encoding with visual error correction during decoding
2192 ///
2193 /// This encoding is a static version of:
2194 ///
2195 /// ```rust
2196 /// # use data_encoding::{Specification, BASE32_NOPAD_VISUAL};
2197 /// let mut spec = Specification::new();
2198 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2199 /// spec.translate.from.push_str("01l8");
2200 /// spec.translate.to.push_str("OIIB");
2201 /// assert_eq!(BASE32_NOPAD_VISUAL, spec.encoding().unwrap());
2202 /// ```
2203 pub const BASE32_NOPAD_VISUAL: Encoding = Encoding::internal_new(BASE32_NOPAD_VISUAL_IMPL);
2204 const BASE32_NOPAD_VISUAL_IMPL: &[u8] = &[
2205 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2206 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2207 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2208 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2209 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2210 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2211 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2212 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2213 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2214 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2215 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2216 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2217 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2218 128, 128, 128, 128, 14, 8, 26, 27, 28, 29, 30, 31, 1, 128, 128, 128, 128, 128, 128, 128, 128,
2219 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2220 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 8, 128,
2221 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2222 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2223 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2224 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2225 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2226 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2227 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2228 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2229 ];
2230
2231 /// Padded base32hex encoding
2232 ///
2233 /// This encoding is a static version of:
2234 ///
2235 /// ```rust
2236 /// # use data_encoding::{Specification, BASE32HEX};
2237 /// let mut spec = Specification::new();
2238 /// spec.symbols.push_str("0123456789ABCDEFGHIJKLMNOPQRSTUV");
2239 /// spec.padding = Some('=');
2240 /// assert_eq!(BASE32HEX, spec.encoding().unwrap());
2241 /// ```
2242 ///
2243 /// It conforms to [RFC4648].
2244 ///
2245 /// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-7
2246 pub const BASE32HEX: Encoding = Encoding::internal_new(BASE32HEX_IMPL);
2247 const BASE32HEX_IMPL: &[u8] = &[
2248 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2249 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2250 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2251 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2252 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2253 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2254 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2255 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2256 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2257 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2258 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2259 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2260 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2261 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 130, 128, 128, 128, 10, 11,
2262 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2263 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2264 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2265 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2266 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2267 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2268 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2269 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2270 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2271 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2272 ];
2273
2274 /// Unpadded base32hex encoding
2275 ///
2276 /// This encoding is a static version of:
2277 ///
2278 /// ```rust
2279 /// # use data_encoding::{Specification, BASE32HEX_NOPAD};
2280 /// let mut spec = Specification::new();
2281 /// spec.symbols.push_str("0123456789ABCDEFGHIJKLMNOPQRSTUV");
2282 /// assert_eq!(BASE32HEX_NOPAD, spec.encoding().unwrap());
2283 /// ```
2284 pub const BASE32HEX_NOPAD: Encoding = Encoding::internal_new(BASE32HEX_NOPAD_IMPL);
2285 const BASE32HEX_NOPAD_IMPL: &[u8] = &[
2286 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2287 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2288 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2289 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2290 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2291 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2292 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2293 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2294 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2295 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2296 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2297 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2298 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2299 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2300 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2301 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2302 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2303 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2304 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2305 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2306 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2307 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2308 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2309 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2310 ];
2311
2312 /// DNSSEC base32 encoding
2313 ///
2314 /// This encoding is a static version of:
2315 ///
2316 /// ```rust
2317 /// # use data_encoding::{Specification, BASE32_DNSSEC};
2318 /// let mut spec = Specification::new();
2319 /// spec.symbols.push_str("0123456789abcdefghijklmnopqrstuv");
2320 /// spec.translate.from.push_str("ABCDEFGHIJKLMNOPQRSTUV");
2321 /// spec.translate.to.push_str("abcdefghijklmnopqrstuv");
2322 /// assert_eq!(BASE32_DNSSEC, spec.encoding().unwrap());
2323 /// ```
2324 ///
2325 /// It conforms to [RFC5155]:
2326 ///
2327 /// - It uses a base32 extended hex alphabet.
2328 /// - It is case-insensitive when decoding and uses lowercase when encoding.
2329 /// - It does not use padding.
2330 ///
2331 /// [RFC5155]: https://tools.ietf.org/html/rfc5155
2332 pub const BASE32_DNSSEC: Encoding = Encoding::internal_new(BASE32_DNSSEC_IMPL);
2333 const BASE32_DNSSEC_IMPL: &[u8] = &[
2334 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
2335 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2336 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2337 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104,
2338 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53,
2339 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
2340 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101,
2341 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49,
2342 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
2343 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98,
2344 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2345 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
2346 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 128, 128, 128, 128, 128, 128, 128,
2347 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2348 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2349 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13,
2350 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128,
2351 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2352 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2353 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2354 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2355 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2356 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2357 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2358 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2359 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2360 ];
2361
2362 #[allow(clippy::doc_markdown)]
2363 /// DNSCurve base32 encoding
2364 ///
2365 /// This encoding is a static version of:
2366 ///
2367 /// ```rust
2368 /// # use data_encoding::{BitOrder, Specification, BASE32_DNSCURVE};
2369 /// let mut spec = Specification::new();
2370 /// spec.symbols.push_str("0123456789bcdfghjklmnpqrstuvwxyz");
2371 /// spec.bit_order = BitOrder::LeastSignificantFirst;
2372 /// spec.translate.from.push_str("BCDFGHJKLMNPQRSTUVWXYZ");
2373 /// spec.translate.to.push_str("bcdfghjklmnpqrstuvwxyz");
2374 /// assert_eq!(BASE32_DNSCURVE, spec.encoding().unwrap());
2375 /// ```
2376 ///
2377 /// It conforms to [DNSCurve].
2378 ///
2379 /// [DNSCurve]: https://dnscurve.org/in-implement.html
2380 pub const BASE32_DNSCURVE: Encoding = Encoding::internal_new(BASE32_DNSCURVE_IMPL);
2381 const BASE32_DNSCURVE_IMPL: &[u8] = &[
2382 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110,
2383 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2384 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119,
2385 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107,
2386 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53,
2387 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116,
2388 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103,
2389 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49,
2390 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113,
2391 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99,
2392 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
2393 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109,
2394 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 128, 128, 128, 128, 128, 128,
2395 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2396 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2397 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2398 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
2399 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128,
2400 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2401 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2402 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2403 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2404 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2405 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2406 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2407 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 21,
2408 ];
2409
2410 /// Padded base64 encoding
2411 ///
2412 /// This encoding is a static version of:
2413 ///
2414 /// ```rust
2415 /// # use data_encoding::{Specification, BASE64};
2416 /// let mut spec = Specification::new();
2417 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2418 /// spec.padding = Some('=');
2419 /// assert_eq!(BASE64, spec.encoding().unwrap());
2420 /// ```
2421 ///
2422 /// It conforms to [RFC4648].
2423 ///
2424 /// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-4
2425 pub const BASE64: Encoding = Encoding::internal_new(BASE64_IMPL);
2426 const BASE64_IMPL: &[u8] = &[
2427 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2428 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2429 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2430 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2431 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2432 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2433 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2434 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2435 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2436 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2437 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2438 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2439 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2440 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2441 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2442 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2443 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2444 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2445 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2446 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2447 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2448 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2449 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2450 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2451 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2452 ];
2453
2454 /// Unpadded base64 encoding
2455 ///
2456 /// This encoding is a static version of:
2457 ///
2458 /// ```rust
2459 /// # use data_encoding::{Specification, BASE64_NOPAD};
2460 /// let mut spec = Specification::new();
2461 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2462 /// assert_eq!(BASE64_NOPAD, spec.encoding().unwrap());
2463 /// ```
2464 pub const BASE64_NOPAD: Encoding = Encoding::internal_new(BASE64_NOPAD_IMPL);
2465 const BASE64_NOPAD_IMPL: &[u8] = &[
2466 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2467 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2468 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2469 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2470 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2471 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2472 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2473 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2474 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2475 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2476 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2477 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2478 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2479 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2480 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2481 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2482 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2483 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2484 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2485 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2486 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2487 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2488 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2489 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2490 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2491 ];
2492
2493 /// MIME base64 encoding
2494 ///
2495 /// This encoding is a static version of:
2496 ///
2497 /// ```rust
2498 /// # use data_encoding::{Specification, BASE64_MIME};
2499 /// let mut spec = Specification::new();
2500 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2501 /// spec.padding = Some('=');
2502 /// spec.wrap.width = 76;
2503 /// spec.wrap.separator.push_str("\r\n");
2504 /// assert_eq!(BASE64_MIME, spec.encoding().unwrap());
2505 /// ```
2506 ///
2507 /// It does not exactly conform to [RFC2045] because it does not print the header
2508 /// and does not ignore all characters.
2509 ///
2510 /// [RFC2045]: https://tools.ietf.org/html/rfc2045
2511 pub const BASE64_MIME: Encoding = Encoding::internal_new(BASE64_MIME_IMPL);
2512 const BASE64_MIME_IMPL: &[u8] = &[
2513 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2514 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2515 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2516 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2517 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2518 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2519 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2520 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2521 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2522 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2523 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2524 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2525 128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2526 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2527 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2528 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2529 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2530 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2531 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2532 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2533 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2534 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2535 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2536 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2537 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30, 76, 13, 10,
2538 ];
2539
2540 /// MIME base64 encoding without trailing bits check
2541 ///
2542 /// This encoding is a static version of:
2543 ///
2544 /// ```rust
2545 /// # use data_encoding::{Specification, BASE64_MIME_PERMISSIVE};
2546 /// let mut spec = Specification::new();
2547 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2548 /// spec.padding = Some('=');
2549 /// spec.wrap.width = 76;
2550 /// spec.wrap.separator.push_str("\r\n");
2551 /// spec.check_trailing_bits = false;
2552 /// assert_eq!(BASE64_MIME_PERMISSIVE, spec.encoding().unwrap());
2553 /// ```
2554 ///
2555 /// It does not exactly conform to [RFC2045] because it does not print the header
2556 /// and does not ignore all characters.
2557 ///
2558 /// [RFC2045]: https://tools.ietf.org/html/rfc2045
2559 pub const BASE64_MIME_PERMISSIVE: Encoding = Encoding::internal_new(BASE64_MIME_PERMISSIVE_IMPL);
2560 const BASE64_MIME_PERMISSIVE_IMPL: &[u8] = &[
2561 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2562 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2563 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2564 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2565 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2566 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2567 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2568 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2569 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2570 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2571 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2572 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2573 128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2574 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2575 128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2576 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2577 24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2578 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2579 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2580 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2581 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2582 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2583 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2584 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2585 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 14, 76, 13, 10,
2586 ];
2587
2588 /// Padded base64url encoding
2589 ///
2590 /// This encoding is a static version of:
2591 ///
2592 /// ```rust
2593 /// # use data_encoding::{Specification, BASE64URL};
2594 /// let mut spec = Specification::new();
2595 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
2596 /// spec.padding = Some('=');
2597 /// assert_eq!(BASE64URL, spec.encoding().unwrap());
2598 /// ```
2599 ///
2600 /// It conforms to [RFC4648].
2601 ///
2602 /// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-5
2603 pub const BASE64URL: Encoding = Encoding::internal_new(BASE64URL_IMPL);
2604 const BASE64URL_IMPL: &[u8] = &[
2605 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2606 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2607 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2608 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2609 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2610 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2611 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2612 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2613 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2614 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2615 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2616 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2617 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2618 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2619 128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2620 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2621 24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2622 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2623 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2624 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2625 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2626 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2627 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2628 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2629 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2630 ];
2631
2632 /// Unpadded base64url encoding
2633 ///
2634 /// This encoding is a static version of:
2635 ///
2636 /// ```rust
2637 /// # use data_encoding::{Specification, BASE64URL_NOPAD};
2638 /// let mut spec = Specification::new();
2639 /// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
2640 /// assert_eq!(BASE64URL_NOPAD, spec.encoding().unwrap());
2641 /// ```
2642 pub const BASE64URL_NOPAD: Encoding = Encoding::internal_new(BASE64URL_NOPAD_IMPL);
2643 const BASE64URL_NOPAD_IMPL: &[u8] = &[
2644 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2645 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2646 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2647 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2648 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2649 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2650 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2651 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2652 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2653 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2654 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2655 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2656 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2657 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2658 128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2659 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2660 24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2661 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2662 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2663 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2664 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2665 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2666 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2667 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2668 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2669 ];
2670