//! Constant-time codecs. #![cfg_attr(not(feature = "std"), no_std)] #![forbid(unsafe_code)] mod base64; mod error; mod hex; pub use base64::*; pub use error::*; pub use hex::*; pub trait Encoder { /// Length of `bin_len` bytes after encoding. fn encoded_len(bin_len: usize) -> Result; /// Encode `bin` into `encoded`. /// The output buffer can be larger than required; the returned slice is /// a view of the buffer with the correct length. fn encode>(encoded: &mut [u8], bin: IN) -> Result<&[u8], Error>; /// Encode `bin` into `encoded`, return the result as a `str`. /// The output buffer can be larger than required; the returned slice is /// a view of the buffer with the correct length. fn encode_to_str>(encoded: &mut [u8], bin: IN) -> Result<&str, Error> { Ok(core::str::from_utf8(Self::encode(encoded, bin)?).unwrap()) } /// Encode `bin` as a `String`. #[cfg(feature = "std")] fn encode_to_string>(bin: IN) -> Result { let mut encoded = vec![0u8; Self::encoded_len(bin.as_ref().len())?]; let encoded_len = Self::encode(&mut encoded, bin)?.len(); encoded.truncate(encoded_len); Ok(String::from_utf8(encoded).unwrap()) } } pub trait Decoder { /// Decode `encoded` into `bin`. /// The output buffer can be larger than required; the returned slice is /// a view of the buffer with the correct length. /// `ignore` is an optional set of characters to ignore. fn decode<'t, IN: AsRef<[u8]>>( bin: &'t mut [u8], encoded: IN, ignore: Option<&[u8]>, ) -> Result<&'t [u8], Error>; /// Decode `encoded` into a `Vec`. /// `ignore` is an optional set of characters to ignore. #[cfg(feature = "std")] fn decode_to_vec>( encoded: IN, ignore: Option<&[u8]>, ) -> Result, Error> { let mut bin = vec![0u8; encoded.as_ref().len()]; let bin_len = Self::decode(&mut bin, encoded, ignore)?.len(); bin.truncate(bin_len); Ok(bin) } }