use crate::{
base32::{BASE32_CROCKFORD, BASE32_RFC},
error::Error,
Encoding, Format, Scheme,
};
use data_encoding::{BASE64URL_NOPAD, HEXLOWER};
#[inline(always)]
pub(crate) fn dec_from_format(
obtext: &str,
format: Format,
master_key: &obcrypt::Key,
) -> Result<String, Error> {
let buffer = decode_obtext_to_payload(obtext, format.encoding())?;
let plaintext_bytes = match format.scheme() {
#[cfg(feature = "dgcmsiv")]
Scheme::Dgcmsiv => obcrypt::schemes::dgcmsiv::decrypt(&buffer, master_key)?,
#[cfg(feature = "pgcmsiv")]
Scheme::Pgcmsiv => obcrypt::schemes::pgcmsiv::decrypt(&buffer, master_key)?,
#[cfg(feature = "dsiv")]
Scheme::Dsiv => obcrypt::schemes::dsiv::decrypt(&buffer, master_key)?,
#[cfg(feature = "psiv")]
Scheme::Psiv => obcrypt::schemes::psiv::decrypt(&buffer, master_key)?,
#[cfg(feature = "mock")]
Scheme::Mock1 => obcrypt::schemes::mock1::decrypt(&buffer, master_key)?,
#[cfg(feature = "mock")]
Scheme::Mock2 => obcrypt::schemes::mock2::decrypt(&buffer, master_key)?,
};
String::from_utf8(plaintext_bytes).map_err(|_| Error::InvalidUtf8)
}
#[inline]
pub(crate) fn decode_obtext_to_payload(obtext: &str, encoding: Encoding) -> Result<Vec<u8>, Error> {
match encoding {
Encoding::B32 => BASE32_RFC
.decode(obtext.as_bytes())
.map_err(|_| Error::InvalidB32),
Encoding::C32 => BASE32_CROCKFORD
.decode(obtext.as_bytes())
.map_err(|_| Error::InvalidC32),
Encoding::B64 => BASE64URL_NOPAD
.decode(obtext.as_bytes())
.map_err(|_| Error::InvalidB64),
Encoding::Hex => HEXLOWER
.decode(obtext.as_bytes())
.map_err(|_| Error::InvalidHex),
}
}