use crate::CryptoError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum AeadAlgo {
Aes128Gcm,
Aes256Gcm,
ChaCha20Poly1305,
Aes128GcmSiv,
Aes256GcmSiv,
XChaCha20Poly1305,
Aes128Ccm,
Aes256Ccm,
Aes128Ocb3,
Aes256Ocb3,
DeoxysII128,
}
#[cfg(feature = "pure")]
#[must_use]
pub fn aead_impl(algo: AeadAlgo) -> oxicrypto_core::Box<dyn oxicrypto_core::Aead + Send + Sync> {
match algo {
AeadAlgo::Aes128Gcm => oxicrypto_core::Box::new(oxicrypto_aead::Aes128Gcm),
AeadAlgo::Aes256Gcm => oxicrypto_core::Box::new(oxicrypto_aead::Aes256Gcm),
AeadAlgo::ChaCha20Poly1305 => oxicrypto_core::Box::new(oxicrypto_aead::ChaCha20Poly1305),
AeadAlgo::Aes128GcmSiv => oxicrypto_core::Box::new(oxicrypto_aead::AesGcmSiv128),
AeadAlgo::Aes256GcmSiv => oxicrypto_core::Box::new(oxicrypto_aead::AesGcmSiv256),
AeadAlgo::XChaCha20Poly1305 => oxicrypto_core::Box::new(oxicrypto_aead::XChaCha20Poly1305),
AeadAlgo::Aes128Ccm => oxicrypto_core::Box::new(oxicrypto_aead::Aes128Ccm),
AeadAlgo::Aes256Ccm => oxicrypto_core::Box::new(oxicrypto_aead::Aes256Ccm),
AeadAlgo::Aes128Ocb3 => oxicrypto_core::Box::new(oxicrypto_aead::Aes128Ocb3),
AeadAlgo::Aes256Ocb3 => oxicrypto_core::Box::new(oxicrypto_aead::Aes256Ocb3),
AeadAlgo::DeoxysII128 => oxicrypto_core::Box::new(oxicrypto_aead::Deoxys2_128),
}
}
impl core::fmt::Display for AeadAlgo {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(match self {
AeadAlgo::Aes128Gcm => "AES-128-GCM",
AeadAlgo::Aes256Gcm => "AES-256-GCM",
AeadAlgo::ChaCha20Poly1305 => "ChaCha20-Poly1305",
AeadAlgo::Aes128GcmSiv => "AES-128-GCM-SIV",
AeadAlgo::Aes256GcmSiv => "AES-256-GCM-SIV",
AeadAlgo::XChaCha20Poly1305 => "XChaCha20-Poly1305",
AeadAlgo::Aes128Ccm => "AES-128-CCM",
AeadAlgo::Aes256Ccm => "AES-256-CCM",
AeadAlgo::Aes128Ocb3 => "AES-128-OCB3",
AeadAlgo::Aes256Ocb3 => "AES-256-OCB3",
AeadAlgo::DeoxysII128 => "Deoxys-II-128-128",
})
}
}
impl core::str::FromStr for AeadAlgo {
type Err = CryptoError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"AES-128-GCM" | "aes-128-gcm" | "AES128GCM" => Ok(AeadAlgo::Aes128Gcm),
"AES-256-GCM" | "aes-256-gcm" | "AES256GCM" => Ok(AeadAlgo::Aes256Gcm),
"ChaCha20-Poly1305" | "chacha20-poly1305" | "CHACHA20POLY1305" => {
Ok(AeadAlgo::ChaCha20Poly1305)
}
"AES-128-GCM-SIV" | "aes-128-gcm-siv" => Ok(AeadAlgo::Aes128GcmSiv),
"AES-256-GCM-SIV" | "aes-256-gcm-siv" => Ok(AeadAlgo::Aes256GcmSiv),
"XChaCha20-Poly1305" | "xchacha20-poly1305" | "XCHACHA20POLY1305" => {
Ok(AeadAlgo::XChaCha20Poly1305)
}
"AES-128-CCM" | "aes-128-ccm" | "AES128CCM" => Ok(AeadAlgo::Aes128Ccm),
"AES-256-CCM" | "aes-256-ccm" | "AES256CCM" => Ok(AeadAlgo::Aes256Ccm),
"AES-128-OCB3" | "aes-128-ocb3" | "AES128OCB3" => Ok(AeadAlgo::Aes128Ocb3),
"AES-256-OCB3" | "aes-256-ocb3" | "AES256OCB3" => Ok(AeadAlgo::Aes256Ocb3),
"Deoxys-II-128-128" | "deoxys-ii-128-128" | "DEOXYSII128" => Ok(AeadAlgo::DeoxysII128),
_ => Err(CryptoError::UnsupportedAlgorithm),
}
}
}
impl TryFrom<&str> for AeadAlgo {
type Error = CryptoError;
fn try_from(s: &str) -> Result<Self, Self::Error> {
s.parse()
}
}