use base64::Engine;
use crate::core::{ErrorKind, XmlError, XmlResult};
pub fn encode_standard_base64(input: impl AsRef<[u8]>) -> String {
base64::engine::general_purpose::STANDARD.encode(input)
}
pub fn decode_standard_base64(input: &str) -> XmlResult<Vec<u8>> {
base64::engine::general_purpose::STANDARD
.decode(input)
.map_err(|error| {
XmlError::new(
ErrorKind::Signature,
format!("invalid standard base64 data: {error}"),
)
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn signature_base64_encodes_standard_padded_values() {
assert_eq!(encode_standard_base64("xdoc"), "eGRvYw==");
assert_eq!(
encode_standard_base64([0_u8, 1, 2, 253, 254, 255]),
"AAEC/f7/"
);
}
#[test]
fn signature_base64_decodes_standard_padded_values() {
assert_eq!(
decode_standard_base64("eGRvYw==").expect("valid base64"),
b"xdoc"
);
}
#[test]
fn signature_base64_rejects_invalid_input() {
let error = decode_standard_base64("not base64!").expect_err("invalid base64 must fail");
assert_eq!(error.kind(), &ErrorKind::Signature);
}
}