codec_base64url/
decode.rs1use base64::{decoded_len_estimate, engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
6use zeroize::Zeroizing;
7
8use crate::{Base64UrlError, MAX_BASE64URL_INPUT_LEN};
9
10pub fn base64url_to_bytes(s: &str) -> Result<Vec<u8>, Base64UrlError> {
12 base64url_bytes_to_bytes(s.as_bytes())
13}
14
15pub fn base64url_bytes_to_bytes(bytes: &[u8]) -> Result<Vec<u8>, Base64UrlError> {
21 if bytes.len() > MAX_BASE64URL_INPUT_LEN {
22 return Err(Base64UrlError::InputTooLarge);
23 }
24 let mut output = Zeroizing::new(vec![0_u8; decoded_len_estimate(bytes.len())]);
27 let length = URL_SAFE_NO_PAD
28 .decode_slice(bytes, output.as_mut_slice())
29 .map_err(|_| Base64UrlError::Invalid)?;
30 output.truncate(length);
31 Ok(core::mem::take(&mut *output))
32}