• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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