diff options
Diffstat (limited to 'vendor/base64ct/src/alphabet/url.rs')
-rw-r--r-- | vendor/base64ct/src/alphabet/url.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/vendor/base64ct/src/alphabet/url.rs b/vendor/base64ct/src/alphabet/url.rs new file mode 100644 index 000000000..432edb852 --- /dev/null +++ b/vendor/base64ct/src/alphabet/url.rs @@ -0,0 +1,54 @@ +//! URL-safe Base64 encoding. + +use super::{Alphabet, DecodeStep, EncodeStep}; + +/// URL-safe Base64 encoding with `=` padding. +/// +/// ```text +/// [A-Z] [a-z] [0-9] - _ +/// 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2d, 0x5f +/// ``` +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub struct Base64Url; + +impl Alphabet for Base64Url { + const BASE: u8 = b'A'; + const DECODER: &'static [DecodeStep] = DECODER; + const ENCODER: &'static [EncodeStep] = ENCODER; + const PADDED: bool = true; + type Unpadded = Base64UrlUnpadded; +} + +/// URL-safe Base64 encoding *without* padding. +/// +/// ```text +/// [A-Z] [a-z] [0-9] - _ +/// 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2d, 0x5f +/// ``` +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub struct Base64UrlUnpadded; + +impl Alphabet for Base64UrlUnpadded { + const BASE: u8 = b'A'; + const DECODER: &'static [DecodeStep] = DECODER; + const ENCODER: &'static [EncodeStep] = ENCODER; + const PADDED: bool = false; + type Unpadded = Self; +} + +/// URL-safe Base64 decoder +const DECODER: &[DecodeStep] = &[ + DecodeStep::Range(b'A'..=b'Z', -64), + DecodeStep::Range(b'a'..=b'z', -70), + DecodeStep::Range(b'0'..=b'9', 5), + DecodeStep::Eq(b'-', 63), + DecodeStep::Eq(b'_', 64), +]; + +/// URL-safe Base64 encoder +const ENCODER: &[EncodeStep] = &[ + EncodeStep::Diff(25, 6), + EncodeStep::Diff(51, -75), + EncodeStep::Diff(61, -(b'-' as i16 - 0x20)), + EncodeStep::Diff(62, b'_' as i16 - b'-' as i16 - 1), +]; |