use alloc::string::String;
use alloc::vec::Vec;
pub fn base64_encode(data: &[u8]) -> String {
use base64::Engine as _;
base64::engine::general_purpose::STANDARD.encode(data)
}
pub fn base64_decode_strict(s: &str) -> Result<Vec<u8>, base64::DecodeError> {
use base64::Engine as _;
base64::engine::general_purpose::STANDARD.decode(s)
}
pub fn base64_decode_lenient(s: &str) -> Result<Vec<u8>, base64::DecodeError> {
use base64::Engine as _;
const LENIENT: base64::engine::GeneralPurpose = base64::engine::GeneralPurpose::new(
&base64::alphabet::STANDARD,
base64::engine::general_purpose::GeneralPurposeConfig::new()
.with_decode_padding_mode(base64::engine::DecodePaddingMode::Indifferent)
.with_decode_allow_trailing_bits(true),
);
LENIENT.decode(s)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trips() {
let data = b"hello";
let enc = base64_encode(data);
assert_eq!(base64_decode_strict(&enc).unwrap(), data);
}
#[test]
fn strict_vs_lenient_on_padding_less_input() {
assert!(base64_decode_strict("aGVsbG8").is_err());
assert_eq!(base64_decode_lenient("aGVsbG8").unwrap(), b"hello");
}
}